首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

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

有一个线程的问题,请教
我在一个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单元的原因导致的。

热点排行