Delphi 多线程问题 急~~~~
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi 多线程问题 急~~~~相关的知识,希望对你有一定的参考价值。
帮忙看看我的为什么会挂掉,我的程序本不是这样,源代码太长,但一旦出现多个线程来查找一个文件夹,就会挂掉,出什么 access violation at.....
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
Private declarations
public
Public declarations
end;
type pa=^integer;
var
Form1: TForm1;
implementation
$R *.dfm
procedure p(pa:pint);stdcall;
var a:integer;sr:TSearchRec;
begin
a:=pa^;
if Findfirst('D:\Windows\*.*',faAnyFile,sr)=0 then
while Findnext(sr)=0 do
inc(a);
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
for i:=1 to 100 do
CreateThread(nil,0,@p,@i,0,PDWord(nil)^);
end;
end.
这样做,所有的线程参数都指向i,
但是创建的线程并不会马上被调度。
而且Delphi的局部变量是保存在堆栈里的,
如果你看汇编可以看到,在函数结束的地方,局部变量都会被销毁掉、、
因此在线程里面引用,自然就是无效的地址了、
你可以这样做:
创建线程的时候不要传递指针:
CreateThread(nil,0,@p,pointer(i),0,PDWord(nil)^);
然后线程里面:
procedure p(pa:pointer);stdcall;
var a:integer;sr:TSearchRec;
begin
a:=integer(pa);
......
这样应该就可以了、、 参考技术A 感觉CreateThread写的不规范。。。
JAVA 线程池 其中一个线程执行失败 则线程重新执行或者重新提交任务 急
整个过程
1、在运行的线程中设置个了一个除数为0线程
2、线程池调用这个线程,通过futrue.get()方法获取到异常后,重新提交任务。
问题:现在调用futrue.get()时 程序就不在继续向下运行,此时异常信息也已经输出,应该怎么处理呢?
现在是想 线程池中 如果线程发生异常 则重新提交任务 现在是 出现异常后 通过 futrue.get() 一直堵塞,捕获异常后,又不知改如何 重新提交任务?
追答get方法会一直阻塞到线程结束。 就是你的get方法得到值的时候,你的线程已经不存在了。
你如果想在线程里捕获异常,然后重新进行任务,那就是线程中的事情,跟futrue.get没有关系;
或则你通过get的返回值,重新new这个线程,重新添加到线程池中执行。
实际应用中,是通过get()返回值 后重新 new 这个线程 还是直接在线程中处理好呢
追答如果可以,直接处理效率更好点。
参考技术A try 预执行代码 catch出错后执行代码追问您是 为了蹭财富值吗
追答你试试不就知道可以不
追问在异常里面确实可以捕捉到,但应该怎么重新提交任务呢?
追答你在catch中重新执行方法不就可以了么,但是有个危险变成死循环,做一个标志位执行几遍还报错的话就跳出循环吧
建议看看java 中 try catch finally 的用法
以上是关于Delphi 多线程问题 急~~~~的主要内容,如果未能解决你的问题,请参考以下文章