LinuxSir.cn,穿越时空的Linuxsir!

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

在C++Kylix3的线程中用popen调用外部程序出现死进程的问题?

[复制链接]
发表于 2003-6-17 16:50:29 | 显示全部楼层 |阅读模式
在C++Kylix3的线程中用popen调用外部程序出现死进程的问题?
我有如下一段代码:
   FILE *fp;
    char buf[200];
    fp=popen("/home/myuser/test","r");//test是一个可执行程序(printf了50次后就自动结束)
    while(fgets(buf,200,fp)!=NULL)
    {
      tem=AnsiString(buf) ;//用管道将终端信息显示到MEMO中
      Form1->Memo1->Lines->Add(tem.SubString(1,tem.Length()-1) );
     }
    pclose(fp);
在主程序中执行,无论执行多少次,用ps命令查看都没有死进程,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
但是将其改在线程中执行(代码如下),每执行一次就多一个popen的死进程
void __fastcall MyPopen::Execute()
{
    FILE *fp;
    char buf[200];
    setsid();
    fp=popen("/home/myuser/test","r");//test是一个可执行程序(printf了50次后就自动结束)

    while(fgets(buf,200,fp)!=NULL)
    {
      tem=AnsiString(buf) ;//用管道将终端信息显示到MEMO中
      Form1->Memo1->Lines->Add(tem.SubString(1,tem.Length()-1) );
    }
    pclose(fp);
   Terminate();
}

用ps -aux显示如下
myuser  23634 0.0  0.0  0  0 ?   Z  14:38  0:00 [popen <defunct>]
myuser  23636 0.0  0.0  0  0 ?   Z  14:38  0:00 [popen <defunct>]
myuser  23637 0.0  0.0  0  0 ?   Z  14:39  0:00 [popen <defunct>]

我应如何改动呢,才能使在线程中的外部调用不出现死进程呢?

多谢!
发表于 2003-6-17 20:57:42 | 显示全部楼层
用delphi编程的时候,线程里不能直接操作界面控件,应该用同步方法,
象Form1->Memo1->Lines……这种代码是不能出现在线程里的,可能是这个原因。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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