dll使用多線程 |
缺席
|
lianhmou
一般會員 發表:1 回覆:3 積分:0 註冊:2007-06-08 發送簡訊給我 |
HI 大家好! 請問一下,delphi的dll檔中能使用多線程嗎?我寫的線程老是被掛起。多多幫忙,謝謝. 代碼如下: //使用線程: SQLSTR:='SELECT DISTINCT(SERIAL_NUMBER) FROM SAJET.G_SN_STATUS WHERE WORK_ORDER=' '''' WORK_ORDER '''' ; getthread[J]:=TestThread.Create(false,SQLSTR,ds_sn,J); //線程: unit Thread; interface uses Classes,DB,DBClient,SysUtils, MConnect, SConnect,StdCtrls, ObjBrkr,Dialogs; type TestThread = class(TThread) private STR:STRING; dd:TDataSource; j:Integer; { Private declarations } protected procedure getdate(); procedure Execute; override; public constructor Create(Suspended:Boolean;getstr:STRING;datasouce:TDataSource;i:integer); end; implementation uses UWORate; constructor tESTTHREAD.Create(Suspended:Boolean;getstr:string;datasouce:TDataSource;i:integer); begin inherited Create(Suspended); dd:=datasouce; STR:=getstr; j:=i; end; procedure TestThread.Execute; begin Synchronize(getdate); end; procedure TestThread.getdate(); var ClientData: TClientDataSet; SocketConn: TSocketConnection; SimpleObjectBroker1: TSimpleObjectBroker; begin try SimpleObjectBroker1:=TSimpleObjectBroker.Create(nil); ClientData:=TClientDataSet.Create(nil); SocketConn:=TSocketConnection.Create(nil); SocketConn.ObjectBroker:=SimpleObjectBroker1; SocketConn.ServerGUID:='{AF550BF4-3BA4-415D-B1F3-E2F7C8ADE30C}'; SocketConn.ServerName:='SajetApserver.RMDB'; SocketConn.Connected := False; SimpleObjectBroker1.Servers.Clear; SocketConn.Host := ''; SocketConn.Address := ''; SimpleObjectBroker1.Servers.Add; SimpleObjectBroker1.Servers[SimpleObjectBroker1.Servers.Count - 1].ComputerName :='10.128.45.210'; SimpleObjectBroker1.Servers[SimpleObjectBroker1.Servers.Count - 1].Enabled := True; ClientData.RemoteServer:=SocketConn; ClientData.ProviderName:='DspQryFTemp'; with ClientData do begin close; Params.Clear; CommandText:=STR; //MessageDlg(STR,mtInformation,[mbok],0); Open; if recordcount<>0 then FWORate.getflag[j]:=true; end; dd.DataSet:=ClientData; finally begin //ClientData.Free; SocketConn.Connected:=false; SocketConn.Free; SimpleObjectBroker1.Servers.Clear; SimpleObjectBroker1.Free; end; end; end; end.
------
lilian 編輯記錄
taishyang 重新編輯於 2007-06-08 12:00:18, 註解 將文章分類成[問題]‧
|
eaglewolf
資深會員 發表:4 回覆:268 積分:429 註冊:2006-07-06 發送簡訊給我 |
|
lianhmou
一般會員 發表:1 回覆:3 積分:0 註冊:2007-06-08 發送簡訊給我 |
|
lianhmou
一般會員 發表:1 回覆:3 積分:0 註冊:2007-06-08 發送簡訊給我 |
//調用線程: getthread[J]:=TestThread.Create(false,SQLSTR,ds_sn,J); //線程: unit Thread; interface uses Classes,DB,DBClient,SysUtils, MConnect, SConnect,StdCtrls, ObjBrkr,Dialogs; type TestThread = class(TThread) private STR:STRING; dd:TDataSource; j:Integer; { Private declarations } protected procedure getdate(); procedure Execute; override; public constructor Create(Suspended:Boolean;getstr:STRING;datasouce:TDataSource;i:integer); end; implementation uses UWORate; constructor tESTTHREAD.Create(Suspended:Boolean;getstr:string;datasouce:TDataSource;i:integer); begin inherited Create(Suspended); dd:=datasouce; STR:=getstr; j:=i; end; procedure TestThread.Execute; begin Synchronize(getdate); end; procedure TestThread.getdate(); var ClientData: TClientDataSet; SocketConn: TSocketConnection; SimpleObjectBroker1: TSimpleObjectBroker; begin try SimpleObjectBroker1:=TSimpleObjectBroker.Create(nil); ClientData:=TClientDataSet.Create(nil); SocketConn:=TSocketConnection.Create(nil); SocketConn.ObjectBroker:=SimpleObjectBroker1; SocketConn.ServerGUID:='{AF550BF4-3BA4-415D-B1F3-E2F7C8ADE30C}'; SocketConn.ServerName:='SajetApserver.RMDB'; SocketConn.Connected := False; SimpleObjectBroker1.Servers.Clear; SocketConn.Host := ''; SocketConn.Address := ''; SimpleObjectBroker1.Servers.Add; SimpleObjectBroker1.Servers[SimpleObjectBroker1.Servers.Count - 1].ComputerName :='10.128.45.210'; SimpleObjectBroker1.Servers[SimpleObjectBroker1.Servers.Count - 1].Enabled := True; ClientData.RemoteServer:=SocketConn; ClientData.ProviderName:='DspQryFTemp'; with ClientData do begin close; Params.Clear; CommandText:=STR; //MessageDlg(STR,mtInformation,[mbok],0); Open; if recordcount<>0 then FWORate.getflag[j]:=true; end; dd.DataSet:=ClientData; finally begin //ClientData.Free; SocketConn.Connected:=false; SocketConn.Free; SimpleObjectBroker1.Servers.Clear; SimpleObjectBroker1.Free; end; end; end; end.
------
lilian |
OsX
版主 發表:6 回覆:151 積分:111 註冊:2003-05-03 發送簡訊給我 |
|
lianhmou
一般會員 發表:1 回覆:3 積分:0 註冊:2007-06-08 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
Synchronize 是用于线程里面的代码将会操作到 VCL 的时候,是指将会直接影响到 Form 上的显示的时候。比如,你要在线程里改变 Label1.Captiion 显示的文字。
我不知道你这里为什么要用 Synchronize。如果那个 DataSet 可能会被多个线程同时使用,你只要给代码加上临界区就可以了。 使用 Synchronize 不恰当的确会把线程卡死。如果你在这里的 DataSet 后面有对应的 DBGrid,因为改变了 DataSet 会改变 DBGrid 的显示,这时候可能需要 Synchronize。但是,在这种情况下,除了使用 Synchronize,还有别的办法。暂时我自己没有测试过在线程里改变一个绑定了界面元素例如DBGrid 的 DataSet 的内容将会出现什么情况。不过,你可以试验一下以下方法: 线程在改变 DataSet 前,先执行:DataSet.DisableControl; 然后,等到线程改变 DataSet 完成后,不要做 DataSet.EnableControl 而是在线程代码里发消息给 VCL 主线程,在主线程的消息处理方法里做 DataSet.EnableControl 这是猜测性的建议,你自己做一下试验。 ===================引 用 lianhmou 文 章=================== 謝謝您的回復,但如果不用Synchronize會不會沖突呢? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |