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上、
这样做,所有的线程参数都指向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的返回值的时候,线程已经执行完毕并退出了。追问

现在是想 线程池中 如果线程发生异常 则重新提交任务 现在是 出现异常后 通过 futrue.get() 一直堵塞,捕获异常后,又不知改如何 重新提交任务?

追答

get方法会一直阻塞到线程结束。 就是你的get方法得到值的时候,你的线程已经不存在了。

你如果想在线程里捕获异常,然后重新进行任务,那就是线程中的事情,跟futrue.get没有关系;

或则你通过get的返回值,重新new这个线程,重新添加到线程池中执行。

追问

实际应用中,是通过get()返回值 后重新 new 这个线程 还是直接在线程中处理好呢

追答

如果可以,直接处理效率更好点。

参考技术A try 预执行代码 catch出错后执行代码追问

您是 为了蹭财富值吗

追答

你试试不就知道可以不

追问

在异常里面确实可以捕捉到,但应该怎么重新提交任务呢?

追答

你在catch中重新执行方法不就可以了么,但是有个危险变成死循环,做一个标志位执行几遍还报错的话就跳出循环吧
建议看看java 中 try catch finally 的用法

以上是关于Delphi 多线程问题 急~~~~的主要内容,如果未能解决你的问题,请参考以下文章

delphi 多线程问题

delphi 的多线程问题

delphi 多线程程序中内存不断上升的问题!

Delphi多线程怎么处理?

Delphi 多线程问题

Delphi多线程问题