• 10641阅读
  • 10回复

如何在图形界面中实时捕获控制台程序的标准输出? [复制链接]

上一主题 下一主题
离线colrain
 
只看楼主 倒序阅读 楼主  发表于: 2006-04-17
我在程序里起了一个进程调用别人.exe 文件,但是我只能在这个程序执行完成后,才得到所有输出,不能实现实时输出,再VC中有个管道重定向可以实现,我查了好几天资料,也不知道我们Qt中是如何实现的。高手们给看看,俺的毕业设计需要这个啊,要不做出来太难看了。
[ 此贴被XChinux在2006-04-17 16:40重新编辑 ]
离线colrain
只看该作者 1楼 发表于: 2006-04-17
各位大侠们帮给看看吧,谢谢啦
离线zh_qk
只看该作者 2楼 发表于: 2006-04-17
网上有用vc6.0编过此类程序,我试过是可以的,兄弟可看看借鉴一下.我有源码,不知道兄弟要不要.
离线colrain
只看该作者 3楼 发表于: 2006-04-17
是啊,我也有那个程序的源代码,但是那个是基于windows的,用到了HWND,我不知道Qt里是如何使用的。
离线colrain
只看该作者 4楼 发表于: 2006-04-17
http://www.vckbase.com/document/viewdoc/?id=1097
就是这个网址,大家谁可以帮着看下。
离线zh_qk
只看该作者 5楼 发表于: 2006-04-17
我的源码不是这个,他好像是:
1、先启动一个线程重定向标准输出,接着启动其他的console程序,接着再启动一个线程读取重定向后的输出
2、得重定向后的输出后再在其他窗口显示。

我把源码传上来,由于对qt了解不深,你看看有没有帮助?
附件: QuickWin_src.zip (106 K) 下载次数:23
离线zh_qk
只看该作者 6楼 发表于: 2006-04-17
对了上面的源码中,你注意的两个类是
class CRedirect
{
  定义很长,就省了。
}

class CRedir : public CRedirect
{
protected:
  void OnChildWrite(UINT OutputID, LPCSTR lpszOutput);
protected:
  virtual void OnChildStarted(LPCSTR lpszCmdLine);
  virtual void OnChildStdOutWrite(LPCSTR lpszBuffer);
  virtual void OnChildStdErrWrite(LPCSTR lpszBuffer);
  virtual void OnChildTerminate();
};
下面的函数是输出函数
void CRedir::OnChildWrite(UINT OutputID, LPCSTR lpszOutput)
{
CFrameWnd *pFrame = (CFrameWnd*)AfxGetMainWnd();
if (pFrame != NULL)
{
if (theApp.m_bOemToAnsi)
{
int len = strlen(lpszOutput);
char *lpszBuffer = new CHAR[len+1];
strcpy(lpszBuffer, lpszOutput);
::OemToChar(lpszBuffer, lpszBuffer);
CopyData(pFrame->m_hWnd, OutputID, NULL, lpszBuffer, strlen(lpszBuffer)+1);
delete [] lpszBuffer;
}
else
CopyData(pFrame->m_hWnd, STDIO_WRITE_TEXT, NULL, lpszOutput, strlen(lpszOutput)+1);
}
}
(你把两个红色的地方改一下)
离线colrain
只看该作者 7楼 发表于: 2006-04-18
谢谢您,我研究下。
离线sinl

只看该作者 8楼 发表于: 2006-04-18
111
离线colrain
只看该作者 9楼 发表于: 2006-04-26
依然没有搞定,在邦分析下吧。 我现在是这样。

   QApplication app( argc, argv );

   QTextEdit te;
   QProcess selfProc;

   app.setActiveWindow(&te);
   te.show();
   selfProc.start("..\\test"); //一个循环程序。
   if(! selfProc.waitForStarted())
       return false;
  /* pTextOutputThrd.start();*/

   char buf[1024];
   memset(buf, 0,sizeof(buf));

   while(selfProc.waitForReadyRead())
   {
       selfProc.readLine(buf, sizeof (buf));
       te.append(buf); //关键在这里, buf中可以得到正确字符串输出,但是te中没有显示
   }

   if(!selfProc.waitForFinished())
   {
       return FALSE;
   }
   /*pTextOutputThrd.wait();*/
   return app.exec();


//关键在这里, buf中可以得到正确字符串输出,但是te中没有显示, 我试着另外起个线程,但是也不能成功。郁闷ing.。邱高手们在给看下吧。
离线colrain
只看该作者 10楼 发表于: 2006-04-26
是否因为我所起的线程用的是进程外的资源的缘故呢
快速回复
限100 字节
 
上一个 下一个