LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 706|回复: 6

关于Kylix3中线程的问题

[复制链接]
发表于 2003-6-11 09:51:43 | 显示全部楼层 |阅读模式
关于Kylix3中线程的问题

我写有一个函数如下:
bool work(AnsiString FName,AnsiString RetName)
{
  Form1->Memo1->Lines->Clear();
  FILE *fp;
  AnsiString tem;
  char buf[200];
  fp=popen(FName.c_str(),"r");
  while(fgets(buf,200,fp)!=NULL) //等程序处理完成,并读出终端信息显示到Form1->Memo1中
  {
   tem=AnsiString(buf) ;
   Form1->Memo1->Lines->Add(tem.SubString(1,tem.Length()-1) );
  }
  pclose(fp);

  if(FileExists(RetName))      // "c:\\ok.dat"))//检测处理结果文件
  {
    DeleteFile(RetName);       //"c:\\ok.dat");
    return true; //处理成功
  }
  else
    return false;//处理失败
}
加在Form的Button中一执行,整个程序就象死了一样,
没有了反应了;直到外部大数据处理程序处理完成后,
程序才有反应。(一般处理数据要30分钟左右)。
所以,我就只好将这个work处理函数加在线程中,

void __fastcall TForm1::Button5Click(TObject *Sender)
{
  MyThread *MyBat=new MyTread(false);
}
来启动处理.
但是传进与传出的参数如何操作呢??只有用extern吗?
如何知道何时处理完成了呢?返回的是true还是false呢?


原来是不用线程的,但是每次一按动数据处理按钮后,按钮没反应了,FORM也没有反应了,
想进行其它操作时,菜单也没有反应了,
为显示处理进度的进度条也没有反应了(因为要显示出正在处理数据,所以用了进度条
,在时钟中用StepIt()循环);
现在只好用线程作处理了。由于自己对线程不熟,所以想不出在线程中参数传入与出的
好方法,还有控制FORM中的进度条与按钮的允许与禁止。。。只好在这里求助了。。多谢!
发表于 2003-6-11 10:10:05 | 显示全部楼层
pthread_join
等待线程终止

pthread_create创建线程

这是pthread中的函数
但是MyThread 应该也有相同功能的函数
发表于 2003-6-11 10:42:31 | 显示全部楼层
对不起,MyThread 是谁定义的 class 呢?自己做的还是 Kylix 带来的?

用 pthread_create() 可以给线索的入口传送一个(void*)指针,你想要指向什么都可以的。

要是我自己做 MyThead 类,就把需要的参数放在这个类的内部变量里面,那就方便多了。和 java 一样,来个 MyThread::start() 启动线索。
 楼主| 发表于 2003-6-11 10:53:22 | 显示全部楼层
我的线程类是kylix3帮我生成的,MyThread是我给出的线程类的
名字
发表于 2003-6-11 11:52:00 | 显示全部楼层
就是说 MyThread 从什么别的类继承过来的了,比如说 Thread 类。
按理说,kylix 会给你文档的,找找看吧!
发表于 2003-6-11 12:04:54 | 显示全部楼层
没用过kylix,不过象这种情况一般可以在你声明MyThread的时候重载一个构造函数,比如(只是示意一下,具体代码还要你自己改一下)

  1. class MyThread: public TThread
  2. {
  3.   AnsiString FName, RetName;
  4. public:
  5.   MyThread(AnsiString Name, AnsiString RName)
  6.   {
  7.     FName = Name;
  8.     RetName = RName;
  9.     // 在这调用启动线程的代码
  10.   }
  11. };
  12. void __fastcall TForm1::Button5Click(TObject *Sender)
  13. {
  14. MyThread *MyBat=new MyTread(name, rname); // 调用重载的构造函数
  15. }
复制代码

你的work函数也要相应的改一改,我原来用delphi的时候,线程是不能直接操作界面元素的,不知道kylix有没有这个限制?
发表于 2003-6-11 16:39:23 | 显示全部楼层
我记忆中kylix3中的线程是这样使用的。
先要用工程创建一个线程。file-》new-》thread输入你的线程的类名称。
创建好后,这个类中有两个主要的函数一个是构造函数,它的参数中可以指定这个线程被创建时是否开始运行。另一个Execute函数则是线程运行的真正控制中心,在Execute函数中写你的比较耗时的代码。

如果你不想让这个线程只执行一次,那么就要在Execute函数中加上while循环体。把上面说的代码放在这个循环体中。

但这样的话它会一直执行,因为循环条件如果不满足则线程不会被中断。所以你要在while中加个Suspend函数。在适当的时候将线程挂起。

你写的线程类被实例化后,可以使用这个类中以下方法来控制线程。
Suspend()挂起
Terminate()中止线程
Resume()挂起后继续执行线程。

注意Resume的调用次数要>=Suspend的调用次数。否则线程仍然挂起。

当然你可以看TThread类的帮助。

如果你新建的线程要修改界面线程中的数据时,或者其他线程的内部数据时要进行同步处理。同步处理参见TThread类的Syn...方法。(不好意思方法名称记不清了,不过看帮助中马上就能找到。)

我知道的就这些了 。希望能帮助你。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表