同时操作,主程序和线程代码 , 在线等~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (

  • 主题发起人 主题发起人 NONO_General
  • 开始时间 开始时间
N

NONO_General

Unregistered / Unconfirmed
GUEST, unregistred user!
同时操作,主程序和线程代码 , 在线等~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ( 积分: 100 )<br />大家好:
我做了一个线程,想让主程序,和线程程序同时操作。
主单元:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
TconnectThread.Resume();
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
TconnectThread := Tconnect.Create(SocketConnection1);
TconnectThread.Priority := tpidle;
Timer1.Enabled := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled := False;
end;
多线程单元:
implementation
uses Unit1;
const
cstTimeOut=50;
procedure Tconnect.ConnectSockt;
begin
try
Socket.Connected := true;
if Socket.Connected then
begin
Form1.Shape1.Brush.Color := ClGreen;
Suspend();
end
else
begin
Form1.Shape1.Brush.Color := clred;
Suspend();
end;
except
Form1.Shape1.Brush.Color := clred;
end;
Form1.Timer1.Enabled := False;
end;

constructor Tconnect.Create(Sckt: TSocketConnection);
begin
Wait_Event:=CreateEvent(nil,true,false,nil);
Socket := Sckt;
inherited Create(true);
end;

procedure Tconnect.Execute;
begin
if WaitForSingleObject(Wait_Event,cstTimeOut)=WAIT_TIMEOUT then
begin
Synchronize(ConnectSockt);
end
else
//结束线程
begin
Exit;
end;
end;
这个可以实现,但每次到线程的代码时,主程序的其它操作就停止了,我想让他们同时进行,请问有什么办法,请各位指教。
 
大家好:
我做了一个线程,想让主程序,和线程程序同时操作。
主单元:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
TconnectThread.Resume();
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
TconnectThread := Tconnect.Create(SocketConnection1);
TconnectThread.Priority := tpidle;
Timer1.Enabled := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled := False;
end;
多线程单元:
implementation
uses Unit1;
const
cstTimeOut=50;
procedure Tconnect.ConnectSockt;
begin
try
Socket.Connected := true;
if Socket.Connected then
begin
Form1.Shape1.Brush.Color := ClGreen;
Suspend();
end
else
begin
Form1.Shape1.Brush.Color := clred;
Suspend();
end;
except
Form1.Shape1.Brush.Color := clred;
end;
Form1.Timer1.Enabled := False;
end;

constructor Tconnect.Create(Sckt: TSocketConnection);
begin
Wait_Event:=CreateEvent(nil,true,false,nil);
Socket := Sckt;
inherited Create(true);
end;

procedure Tconnect.Execute;
begin
if WaitForSingleObject(Wait_Event,cstTimeOut)=WAIT_TIMEOUT then
begin
Synchronize(ConnectSockt);
end
else
//结束线程
begin
Exit;
end;
end;
这个可以实现,但每次到线程的代码时,主程序的其它操作就停止了,我想让他们同时进行,请问有什么办法,请各位指教。
 
Synchronize造成的
建议线程中不要直接操作界面,TSocketConnection在线程中动态创建,然后去掉Synchronize
 
关键在Execute中的 Synchronize(ConnectSockt);
你把所有的操作都放在Synchronize中同步执行了,还期望它怎么并发执行?正确的做法是仅仅把需要操作VCL或共享资源访问的代码放在Synchronize中同步执行。可改成下面这样:
Tconnect的private部分,定义FIndex: Integer;
procedure Tconnect.DoSyncMain;
begin
case FIndex of
0: Form1.Shape1.Brush.Color := ClGreen;
1: Form1.Shape1.Brush.Color := ClRed;
2: Form1.Timer1.Enabled := False;
end;
end;

procedure Tconnect.SyncMain(Index: Integer);
begin
FIndex := Index;
Synchronize(DoSyncMain);
end;

Execute中:
if WaitForSingleObject(Wait_Event,cstTimeOut)=WAIT_TIMEOUT then
begin
try
Socket.Connected := true;
if Socket.Connected then
begin
SyncMain(0);
Suspend();
end
else
begin
SyncMain(1);
Suspend();
end;
except
SyncMain(1);
end;
SyncMain(2);
end;
 
你好lichengbin
你的思路可以借鉴,但你的方法好象没法实现,请在帮忙看一下
 
不明白!我都给你改写成上面的样子,SyncMain、DoSyncMain也都给出了实际的代码,为什么还是“没法实现”?[:D]
 
恩是啊
我就是按照上面你给的程序改的,好象到了什么地方没法运行了。
 
大家好,向大家问一个问题,用Socket做的网络连接,如果想一直监测,网络是否畅通,比如,通Shape1的Color := clgreen,不通Color := clred;请问谁有这方面经验。(连接监测想qq一样)
 
后退
顶部