多线程消息处理,该怎么处理
多线程消息处理
我刚刚入门多线程,遇到了一些疑问。
问题1:
我采用 调用API 的方法才创建一个新线程,该区域的代码截取如下:
大家都知道线程是并发,所以我这么干的话,文本框在线程未结束时就显示“线程终止”。
通过对一些资料的学习,我初步了解到可以采用 消息处理 的方法,来确保线程终止之后才执行
由于我是初学,所以查阅了一些资料,仍然没有找到我想要的(或是找到了自己也没注意),因此前来求教!
问题2:
为什么我在新建的线程当中添加
------解决思路----------------------
Form1.Hide和Form2.Show是访问了界面的,需要同步到主线程执行!
用TThread类吧,有个小例子:
------解决思路----------------------
新手就先學會用TThread吧
------解决思路----------------------
研究API建立線程,這有完整的教程
http://www.cnblogs.com/del/category/174761.html
------解决思路----------------------
对
我刚刚入门多线程,遇到了一些疑问。
问题1:
我采用 调用API 的方法才创建一个新线程,该区域的代码截取如下:
procedure TForm1.btn1Click(Sender: TObject);
var
ID:THandle;
begin
edt1.Text:='线程开始。';
CreateThread(nil, 0, @MyFunction, nil, 0, ID);
edt2.Text:='线程终止。';
//下面还有大量代码,因为与问题无关,此处省略……
end;
大家都知道线程是并发,所以我这么干的话,文本框在线程未结束时就显示“线程终止”。
通过对一些资料的学习,我初步了解到可以采用 消息处理 的方法,来确保线程终止之后才执行
edt2.Text:='线程终止。';以及此后的语句。
由于我是初学,所以查阅了一些资料,仍然没有找到我想要的(或是找到了自己也没注意),因此前来求教!
问题2:
为什么我在新建的线程当中添加
Form1.Hide;,结果Form1消失了,Form2却没有显示?但是我很清楚地知道Form2里面的代码已经运行,只是整个窗口都找不到了……
Form2.Show;
------解决思路----------------------
Form1.Hide和Form2.Show是访问了界面的,需要同步到主线程执行!
用TThread类吧,有个小例子:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FMyThread: TThread;
procedure DoMyTerminateEvent(Sender: TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TMyThread = class(TThread)
procedure Execute; override;
procedure DoIt;
end;
{ TMyThread }
procedure TMyThread.DoIt;
begin
ShowMessage('线程执行中...');
end;
procedure TMyThread.Execute;
begin
inherited;
//线程中执行的代码,如果访问界面,就需要同步到主线程:
Synchronize(DoIt);
end;
{ TForm1 }
procedure TForm1.DoMyTerminateEvent(Sender: TObject);
begin
ShowMessage('线程终止');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FMyThread := TMyThread.Create(True);
FMyThread.OnTerminate := DoMyTerminateEvent;
FMyThread.Resume;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FMyThread.Free;
end;
end.
------解决思路----------------------
新手就先學會用TThread吧
------解决思路----------------------
研究API建立線程,這有完整的教程
http://www.cnblogs.com/del/category/174761.html
------解决思路----------------------
对