读书人

线程中使用窗口控件的有关问题

发布时间: 2012-02-20 21:18:23 作者: rapoo

线程中使用窗口控件的问题
我的线程和form都在同一个pas中。

form中有一个mscomm控件。我在这个pas中定义了很多类似下面的函数:
procedure CtrlUp();
begin
//抬针
SetControl($FF,C_UP,False);
WaitForSampleCtrlStatus(csUp);
end;
procedure CtrlDown();
begin
//放针
SetControl($FF,C_DOWN,False);
WaitForSampleCtrlStatus(csDown);
end;
procedure CtrlReset();
begin
//复位
SetControl($FF,C_RESET,False);
WaitForSampleCtrlStatus(csReset);
end;
……
其中SetControl中使用了form.mscomm。

那么,我的问题是,上面那些函数,我是否可以在线程中直接使用???


[解决办法]
应该没问题,你可以试一试,不过调用的时候要用
Synchronize(CtrlReset);
[解决办法]
主线程中可以直接执行线程忠的方法,如上所示,用序列化来显示执行结果.
[解决办法]
Synchronize(CtrlTurntable(FTurntableIndex));
Synchronize里面的函数不能带参数!
[解决办法]
procedure DoCtrlTurntable;
begin
CtrlTurntable(FTurntableIndex);
end;
constructor TAutoThread.Create(cn : string;ti,ci : integer);
begin
FCasesNo := cn;
FTurntableIndex := ti;
FChannelIndex := ci;
inherited Create(False);
end;
procedure TAutoThread.Execute;
begin
//执行完毕自动释放
FreeOnTerminate := True;
//首先
EnterCriticalSection(csCtrl);
try
//
Synchronize(DOCtrlTurntable);
finally
LeaveCriticalSection(csCtrl);
end;
end;

[解决办法]
线程使用简介:
=======================================================
线程创建和执行
create();
Execute;

线程终止
FreeOnTerminate;
OnTerminate;
Terminated;
Terminate;

与VCL同步
Synchronize();
消息

优先级
Priority;

挂起和唤醒
Suspend;
Resume;

测试线程时间
GetThreadTimes();

线程局部变量
threadvar

线程同步
1.临界区
CS: TRTLCriticalSection;
InitializeCriticalSection(CS);
EnterCriticalSection(CS);
LeaveCriticalSection(CS);
DeleteCriticalSection(CS);
2.互斥
hMutex: THandle = 0;
hMutex := CreateMutex(nil, False, nil);
if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 then
ReleaseMutex(hMutex);
CloseHandle(hMutex);
3.信号量
hSem: THandle = 0;
hSem := CreateSemaphore(nil, 1, 1, nil);
if WaitForSingleObject(hSem, INFINITE)= WAIT_OBJECT_0 then
ReleaseSemaphore(hSem, 1, nil);
CloseHandle(hSem);
4.事件

读书人网 >.NET

热点推荐