读书人

有一个线程的有关问题请问

发布时间: 2012-02-17 17:50:42 作者: rapoo

有一个线程的问题,请教
我在一个form中定义了一个public的myDBTable
并且我在form创建的时候,给它赋值了。

然后我想在一个线程中使用,结果无法访问。请教原因

定义部分

public
myDBTable,myDBTable1:TDAMemDataTable; //就是要用这个myDBTable
yjbh,Waittime1:integer;
yjmc:string;
yjdx,yjfs:Integer;
function NeedSave : boolean; override;
{ Public declarations }
end;

var
EXPERIForm: TEXPERIForm;
hloopHandle:Thandle ; //线程 句柄
dloopThreadID:DWORD ; //线程 id
CS:TRTLCriticalSection;
lpHandles:Thandle;
lpTheradID:DWORD;



线程部分:

//线程处理函数一
procedure doloop(P:pointer);stdcall;
var
i:Integer;
begin
with EXPERIForm.myDBTable do begin //这一句报错,无法访问
while not eof do begin
EnterCriticalSection(CS);
Sleep(25);
try
if (EXPERIForm.yjmc<>fieldbyName('yjmc').AsString) or
(EXPERIForm.yjbh<>fieldbyName('yjbh').AsInteger) or
(EXPERIForm.yjdx<>fieldbyName('yjdx').AsInteger) or
(EXPERIForm.yjfs<>fieldbyName('yjfs').AsInteger) then begin

EXPERIForm.yjmc:=fieldbyName('yjmc').AsString; //元件名称
EXPERIForm.yjbh:=fieldbyName('yjbh').AsInteger; //元件编号
EXPERIForm.yjdx:=fieldbyName('yjdx').AsInteger; //元件字节长度
EXPERIForm.yjfs:=fieldbyName('yjfs').AsInteger; //操作方式
end;

if COM_ReadFromPLC(EXPERIForm.yjmc,EXPERIForm.yjbh,EXPERIForm.yjdx,EXPERIForm.yjfs)then begin
Next;
end;
Sleep(15);
finally
LeaveCriticalSection(CS);
end;
end;
end;
end;


谢谢

[解决办法]
移动一下位置:
var

myDBTable,myDBTable1:TDAMemDataTable; //就是要用这个myDBTable
[解决办法]
在线程内定义一个变量x:TDAMemDataTable,创建线程时就传myDBTable进去赋值给X; x:=myDBTable
[解决办法]
唉~3L太勤奋了,问题都被乃回答光了 *_*
[解决办法]
你的主线程和子线程定义的变量生命周期和作用域是不同的,想使用的话如3L传进去
[解决办法]
EXPERIForm 没有初赋值,当然没有办法访问了。
[解决办法]
EnterCriticalSection(CS);
这句应该提到徇环外面,执行一次就够了。
[解决办法]

Delphi(Pascal) code
function CreateThread(  lpThreadAttributes: Pointer;           {安全设置}  dwStackSize: DWORD;                    {堆栈大小}  lpStartAddress: TFNThreadStartRoutine; {入口函数}  lpParameter: Pointer;                  {函数参数}  dwCreationFlags: DWORD;                {启动选项}  var lpThreadId: DWORD                  {输出线程 ID }): THandle; stdcall;                     {返回线程句柄}
[解决办法]
其实线程调用一般函数没有问题,但是你要搞清楚调用的东西是否与线程相关。像基于com的一些控件,调用他们的函数时就会出错。
sleep函数与线程没有什么关系吧,我经常那么用的。
[解决办法]
建议还是用继承TThread方式建立新线程类吧,如果sleep报错的话是不是没有调用sysutils单元的原因导致的。

读书人网 >.NET

热点推荐