線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2232
推到 Plurk!
推到 Facebook!

dll使用多線程

缺席
lianhmou
一般會員


發表:1
回覆:3
積分:0
註冊:2007-06-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-08 11:58:18 IP:210.21.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-08 12:16:47 IP:211.75.xxx.xxx 訂閱
QQ
可以排個版嗎????
看了很痛苦的source code
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
lianhmou
一般會員


發表:1
回覆:3
積分:0
註冊:2007-06-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-08 12:32:57 IP:210.21.xxx.xxx 訂閱
我排了版的,但不知道為什麼會變成這樣
------
lilian
lianhmou
一般會員


發表:1
回覆:3
積分:0
註冊:2007-06-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-08 12:36:23 IP:210.21.xxx.xxx 訂閱

//調用線程:
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-08 14:48:40 IP:220.130.xxx.xxx 未訂閱
我看程式猜的,沒 RUN 過  <textarea class="delphi" rows="10" cols="60" name="code"> procedure TestThread.Execute; begin getdate; end; </textarea>
lianhmou
一般會員


發表:1
回覆:3
積分:0
註冊:2007-06-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-06-08 15:31:32 IP:210.21.xxx.xxx 訂閱
謝謝您的回復,但如果不用Synchronize會不會沖突呢?
------
lilian
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-06-08 21:50:51 IP:59.40.xxx.xxx 訂閱
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會不會沖突呢?
系統時間:2024-05-19 16:36:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!