多线程相互通讯问题 主线程启动一个新的线程去取数据,当子线程返回的时候,如何得到子线程所采集的数据(保存在一个对象里边),如果可以麻烦个位写点简单的代码表示。不明白如何写的地方:1。子线程如何通知主线程来取数据2。主线程如何获得数据3。子线程该什么时候结束,如果要等待主线程将数据取走,使用什么样子的方式比较合适 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 貌似线程的同步,给你一段示例代码:两个线程,一个线程对功能区域读,一个写,用互斥来做的,unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; MutexHandle: THandle; ThreadHandle, ThreadHandle1: THandle; publicmem : array[0..1000] of integer;//公共区域implementation{$R *.DFM}function ThreadFunc1(Info: Pointer): Integer; stdcall;//线程1var ICount: Integer; CountStr: string;begin //用来对功能区域赋值 if WaitForSingleObject(MutexHandle, INFINITE)= WAIT_OBJECT_0 THEN begin for ICount := 0 to 1000 do publicmem[ICount] := ICount; ReleaseMutex(MutexHandle); ExitThread(1); end;end;function ThreadFunc2(Info: Pointer): Integer; stdcall;var ICount: Integer; CountStr: string;begin//线程2,读公共区域 if WaitForSingleObject(MutexHandle, INFINITE)= WAIT_OBJECT_0 then begin for ICount := 1 to 1000 do Form1.Canvas.TextOut(160, 10, 'Thread 2 ' + inttostr(publicmem[icount])); ReleaseMutex(MutexHandle); ExitThread(2); end;end;procedure TForm1.FormCreate(Sender: TObject);begin MutexHandle:=DWORD(-1);end;procedure TForm1.Button1Click(Sender: TObject);var ThreadId1, ThreadId2, ThreadId3: DWORD;begin if MutexHandle<>DWORD(-1) then CloseHandle(MutexHandle); MutexHandle := CreateMutex(nil, False, 'MyMutex'); ThreadHandle := CreateThread(nil, 0, @ThreadFunc1, nil, 0, ThreadId1); ThreadHandle1 := CreateThread(nil, 0, @ThreadFunc2, nil,0 , ThreadId2);end;end. 1。子线程如何通知主线程来取数据 子线程将主线程的Handle作为引用,需要通知时,SendMessage(FParentHandle, WM_MyMsg, ...)2。主线程如何获得数据 可以用全局变量,如上wudi_1982所说,或SendMessage的WParam, LParam参数。3。子线程该什么时候结束,如果要等待主线程将数据取走,使用什么样子的方式比较合适 当然是主线程通知,取决你的线程,组件,逻辑设计。像TClientSocket有数据取出,你说你怎么决定将它数据取走? 监控按键是否按下 执行存储过程,第一遍可以,第二遍出错 delphi7的Treeview不能用了 关于控件与窗体协调变化的一个问题 如何做文件关联? 寻找链表结构 (紧急求救)请问在Delphi中如何使用扫描枪取得条形码? 用FastReport做如下报表如何做?有例子的更好!进者有分! 急,高分求解决办法!!将数据库中的图片以略缩图方式显示,点某个图片时,显示整条记录!! 請問哪里有SReport報表控件下載? 大哥们~帮帮忙~~ Turbo 系列以及 BDS 2006推出新的补丁程序了,请赶快下载。。。。。。。。。。。。。。。
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations } end;var
Form1: TForm1;
MutexHandle: THandle;
ThreadHandle, ThreadHandle1: THandle;
publicmem : array[0..1000] of integer;//公共区域
implementation{$R *.DFM}function ThreadFunc1(Info: Pointer): Integer; stdcall;//线程1
var
ICount: Integer;
CountStr: string;
begin
//用来对功能区域赋值
if WaitForSingleObject(MutexHandle, INFINITE)= WAIT_OBJECT_0 THEN
begin
for ICount := 0 to 1000 do publicmem[ICount] := ICount;
ReleaseMutex(MutexHandle);
ExitThread(1);
end;
end;function ThreadFunc2(Info: Pointer): Integer; stdcall;
var
ICount: Integer;
CountStr: string;
begin
//线程2,读公共区域
if WaitForSingleObject(MutexHandle, INFINITE)= WAIT_OBJECT_0 then
begin
for ICount := 1 to 1000 do Form1.Canvas.TextOut(160, 10, 'Thread 2 ' + inttostr(publicmem[icount]));
ReleaseMutex(MutexHandle);
ExitThread(2);
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
MutexHandle:=DWORD(-1);
end;procedure TForm1.Button1Click(Sender: TObject);
var
ThreadId1, ThreadId2, ThreadId3: DWORD;
begin
if MutexHandle<>DWORD(-1) then
CloseHandle(MutexHandle);
MutexHandle := CreateMutex(nil, False, 'MyMutex');
ThreadHandle := CreateThread(nil, 0, @ThreadFunc1, nil, 0, ThreadId1);
ThreadHandle1 := CreateThread(nil, 0, @ThreadFunc2, nil,0 , ThreadId2);end;end.
子线程将主线程的Handle作为引用,需要通知时,SendMessage(FParentHandle, WM_MyMsg, ...)2。主线程如何获得数据
可以用全局变量,如上wudi_1982所说,或SendMessage的WParam, LParam参数。3。子线程该什么时候结束,如果要等待主线程将数据取走,使用什么样子的方式比较合适
当然是主线程通知,取决你的线程,组件,逻辑设计。像TClientSocket有数据取出,你说你怎么决定将它数据取走?