读书人

多线程消息处理解决思路

发布时间: 2012-08-25 10:06:20 作者: rapoo

多线程消息处理
我刚刚入门多线程,遇到了一些疑问。

问题1:

我采用 调用API 的方法才创建一个新线程,该区域的代码截取如下:

Delphi(Pascal) code
procedure TForm1.btn1Click(Sender: TObject);var  ID:THandle;begin  edt1.Text:='线程开始。';  CreateThread(nil, 0, @MyFunction, nil, 0, ID);  edt2.Text:='线程终止。';  //下面还有大量代码,因为与问题无关,此处省略……end;


大家都知道线程是并发,所以我这么干的话,文本框在线程未结束时就显示“线程终止”。

通过对一些资料的学习,我初步了解到可以采用 消息处理 的方法,来确保线程终止之后才执行

Delphi(Pascal) code
edt2.Text:='线程终止。';
以及此后的语句。

由于我是初学,所以查阅了一些资料,仍然没有找到我想要的(或是找到了自己也没注意),因此前来求教!

问题2:
为什么我在新建的线程当中添加
Delphi(Pascal) code
Form1.Hide;Form2.Show;
,结果Form1消失了,Form2却没有显示?但是我很清楚地知道Form2里面的代码已经运行,只是整个窗口都找不到了……

[解决办法]
Form1.Hide和Form2.Show是访问了界面的,需要同步到主线程执行!
用TThread类吧,有个小例子:
Delphi(Pascal) code
unit Unit1;interfaceuses  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
[解决办法]
探讨
引用:

Form1.Hide和Form2.Show是访问了界面的,需要同步到主线程执行!
……


那个Synchronize我查了一下词典是同步的意思。你的意思是说,Form2.show这类代码要用这个函数来运行吗?

FMyThread.OnTerminate := DoMyTerminateEvent; 这个是用来只是线程终止事件的吧?

读书人网 >.NET

热点推荐