线程初学问题:怎么创建多线程? ( 积分: 20 )

  • 主题发起人 主题发起人 qingyuaccess
  • 开始时间 开始时间
Q

qingyuaccess

Unregistered / Unconfirmed
GUEST, unregistred user!
一个带有5个以上带窗体DLL的程序。每个有一个过程,用于查询数据库的,在主程序里的变量改变时,如果DLL已经运行,就执行DLL里内的查询过程,但是如果连续5个以上的话,很慢。所以我想用线程,但是一个线程单元一个线程我就会,一个线程单元几个线程的话,我不会建。
请高手指点一下,怎么在一个线程单元内建立多个线程,且每个线程可以根据条件单一运行或多个同时运行。
 
一个带有5个以上带窗体DLL的程序。每个有一个过程,用于查询数据库的,在主程序里的变量改变时,如果DLL已经运行,就执行DLL里内的查询过程,但是如果连续5个以上的话,很慢。所以我想用线程,但是一个线程单元一个线程我就会,一个线程单元几个线程的话,我不会建。
请高手指点一下,怎么在一个线程单元内建立多个线程,且每个线程可以根据条件单一运行或多个同时运行。
 
接著往后寫就是了
 
怎么写?每一个线程应该有自己的名字吧?
但系统的给出的那个线程是和单元同名的呀.
 
线程只要从TThread继承下来就行了,随便命名,与 单元名 无关
例:
TBSUDPServerThread = class(TThread) //UDPServer线程
 
就像普通的过程一样?
调用是否也像单一线程一样调用?
有什么区别的吗>
 
跟单一线程一样,没有什么区别。你开几个都没有关系的。
 
谢谢.那我先试试,吃饭回来后再给分你
 
一个DLL过程,明明我在主程序单测试时OK,但是加回线程里面就出错.提示下面这些XXXX
Project Wonder.exe raised exception class EAccessViolation with message 'Access violation at address 00428014 in module 'wonder.exe'.Write of address 0000000F'.Process stopped.Use Step or Run to continue
这是怎么回事?我不加入线程里面是成功的,应该这个过程的语句没有问题.
这个是线程语句;
procedure SQLFiveThread.Execute;
begin
FiveSQL(Longint(FiveFormRef),WonderForm.AQShowType.Connection,
WonderForm.Caption,
WonderForm.AQShowType.FieldbyName('TypeID').AsString,
WonderForm.AQShowType.FieldByName('OutNum').AsInteger);
{ Place thread code here }
end;
加入这个过程就出错:
procedure TWonderForm.AQShowTypeAfterScroll(DataSet: TDataSet);
//
begin
//
if Assigned(FiveFormRef) then
SQLFiveThread.Create(False);
end;
但是单独这样使用没有出错;
procedure TWonderForm.dxTestClick(Sender: TObject);
begin
if assigned(FiveFormRef) then
FiveSQL(Longint(FiveFormRef),WonderForm.AQShowType.Connection,
Caption,WonderForm.AQShowType.FieldbyName('TypeID').AsString,
WonderForm.AQShowType.FieldByName('OutNum').AsInteger);
end;
 
线程和主程序中的主要区别在于数据同步问题。
也就是说,线程要与其他线程进行数据交换必须要加同步才行,这你可以看看有关线程方面的资料
 
我书买了不少,但是没有哪本对线程和DLL描述详细一点的,仅有用一点的就是那本<D5开发人员指南>,何谓数据同步?我的这个错误是错在哪里?请指点我一下
谢谢?
 
是这样的:
你现在TWonderForm和SQLFiveThread是二个类,在不同的线程运行。
procedure SQLFiveThread.Execute;
begin
FiveSQL(Longint(FiveFormRef),WonderForm.AQShowType.Connection,
WonderForm.Caption,
WonderForm.AQShowType.FieldbyName('TypeID').AsString,
WonderForm.AQShowType.FieldByName('OutNum').AsInteger);
{ Place thread code here }
end;
上面的像WonderForm.Caption之类的参数,都是二个线程之间交换数据。直接这样交换数据是不行的
 
呵呵...看来线程和普通的过程是不一样的呀.但是同一样的查询语句,我在DLL内部直接用
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='XXXXXX'+TypeID;//Typeid是从别一个DLL函数得来的值
ADOQuery1.open;
这样却没有出错呀.我只不过是把这个语句组合成一个过程,在DLL外部调用.
如果要进行数据交换,该怎么做,举个例子给我好吗?
还有,关于线程的书籍,不知有什么好选择,我买了一大堆的垃圾,真的想找一本好书.
谢谢
 
<D5开发人员指南>
就是一本很好的书呀
也不是很容易说的情楚。
像上面的情况你可以在SQLFiveThread建一些属性或通过构造函数等方法,先把参数传给SQLFiveThread就可以了
 
呵呵...我查了一下大富翁离线资料有关于数据同步的问题,都是数据库的.
夜了,明天说吧.
 
终找到了问题所在:
procedure SQLFiveThread.Execute;
begin
FiveSQL(Longint(FiveFormRef),WonderForm.AQShowType.Connection,
WonderForm.Caption,
WonderForm.AQShowType.FieldbyName('TypeID').AsString,
WonderForm.AQShowType.FieldByName('OutNum').AsInteger);
{ Place thread code here }
end;
这样没有问题,出问题的原因是在Longint(FiveFormRef)这个参数上面,线程没有找到这个窗体变量.但是现在线程需要可以通行,但是好像很不稳定,有时会提示yostgxf所说的线程同步问题,但是按确定后,数据还是可以显示.旧帖所说用Synchronize()进行同步,是怎么回事?那构造函数又有什么用?
 
多人接受答案了。
 
后退
顶部