在QT 下怎么qt 调用c语言函数这个消息函数,求

槽函数里的内容必须执行完才能执行别的操作,比如界面上一个按钮,按下后执行它的槽函数,但是必须等槽函数执行完界面上的别的按钮才能按,求问该怎么解决啊?
回复讨论(解决方案)
耗时操作需要放到另一个线程里去执行。
加一个消息捕捉器,然后进行循环等待,
而槽函数在执行完的最后一句加一个消息发送。
消息捕捉器收到后,退出循环。
一般消息捕捉器要有个超时检查,以防死机。
多线程了!!!下次自动登录
现在的位置:
& 综合 & 正文
QT中调用外部程序的方法
上个月有人写信问我这个问题,当时做了比较详细的回答,把回答内容放上来,也许对其它 人会有些用处的吧。有些地方我的理解可能也不正确,欢迎指正:
我做的那个小软件的图形界面是基于QT3.2的,在主界面的命令行编辑框输入命令以后要执行别人已经写好的可执行文件。这些可执行文件执行的时间比较长,在终端上运行时会显示一些运行的信息,最后才显示执行结果。我的界面上有一个文本框,我想把它们在后台执行过程中的信息不断添加到文本框中,相当于实时显示吧,不过要求也不是那么高。
我说我现在怎么做的吧,我在一个叫做QGUI_CommandWidget类(属于主窗口)中定义了一个命令行编辑框输入命令,定义一个QTextEdit对象用来显示那些执行信息,定义了一个自定义的MyThread类对象用来执行外部,在这个线程的run函数里我调用fork,execv函数执行外部程序,把可执行程序的标准输出重定向到管道,然后从管道读那些信息,再把这些信息用QApplication::postEvent()函数传回主线程,由主线程把这些信息append到文本框中。
我现在的疑问是:
第一,执行外部程序,用fork、execv函数是不是不行,非要用QProcess不可?为什么呢?论坛上讲的也不是很清楚。具体怎么做呢?在那个QGUI_CommandWidget类创建一个QProcess类对象还是在我MyThread类对象里再创建一个QProcess类对象?
第二,基于qt3的GUI线程和非GUI线程的通信,应该怎么做?那个外部程序我是不能更改的,它什么时候结束我也不知道。用QProcess的话它的输出信息我要怎么样才能读到然后回显在我的主窗口的文本框中?怎么知道可执行程序结束然后杀死该线程?
第三,我在《C++ GUI programming with qt3》中看到:“ QTimer 类以及应用于网络的QFtp, QHttp, QSocket, and QSocketNotifier 类都是基于消息事件循环的,所以也不能用在非GUI线程中。”这是为什么呢?还有我看了别人用QQSocketdevice的例子里都用到了QSocketNotifier。在你的博客说到用Qthread、QQSocketdevice、QWaitCondition可以完成视频采集,你是否也用到QSocketNotifier?
1)完全可以使用fork,execv函数,其实QProcess类只是对这些底层函数的封装而已,但是考虑到使用QProcess的话,不需要自己处理程序管道,也不需要自己处理windows下的情况,可以省去很多时间,因此还是推荐使用QProcess,他们的效果将是一样的。2)照你的需求,完全可以不需要使用线程,因为QProcess已经自己处理掉这些事了,在使用QProcess的start函数执行外部程序后,这个函数不会被阻塞,另外QProcess也会以事件的方式自动将外部程序传回的信息反馈回来。具体看以下这个简单的例子:class enstCdRecord : public QObject...{
。。。。。。。。。。。。
QProcess mP};enstCdRecord::enstCdRecord(QWidget *pParent)...{
mParent = pP
connect(&mProcess, SIGNAL(readyReadStandardError()), this,
SLOT(ReadProcessOutput())); //连接readyReadStandardError事件,这样就可以
得到程序StdErr中的信息了,同样也可以连接其 readyReadOutput事件。}bool enstCdRecord::CreateCd(const QString &pImageFile)...{
cmdlist.append("-v");
cmdlist.append("speed=2");
cmdlist.append(pImageFile);
mProcess.start("cdrecord.exe", cmdlist);
while (! mProcess.waitForFinished(300)) ...{ //启动程序后,用循环等待其结
束,如果对程序何时结束并不关心,以下代码可以不需要。
if (mProcess.state() == QProcess::NotRunning) ...{ //process failed
QMessageBox::critical(mParent, SYSTEMNAME, tr("Error when record cd."));
return false;
qApp-&processEvents(); //防止UI死锁,一般情况下,用这种等一小段时间(这
里是300ms),让UI响应一次的办法,已经足够使用了。
if (mProcess.exitCode() != 0) ...{ //error when run process
QMessageBox::critical(mParent, SYSTEMNAME, tr("Error when record cd."));
return false;
return true;}void enstCdRecord::ReadProcessOutput()...{
QMessageBox::critical(mParent, SYSTEMNAME,
mProcess.readAllStandardError()); //将程序的StdErr信息显示出来。}外部程序究竟使用StdOut还是使用StdErr来作为运行时状态的输出,各个程序的处理方式都不一样,甚至可能根本没有输出,这个需要自己试验。3)一般网络程序中只要在主线程中使用QSocket和QSocketNotifier,就可以完成数据的发送和接收了,它们不会造成程序界面死锁。在我写的blog的情况下,我的程序在从网络上接收到数据后,需要做一些计算处理和保存工作,由于数据量很大,并且程序对性能的要求比较高,因此只能将整个网络数据接收功能放到线程中了,在那种情况下,QSocket并不适用,而必须使用同步的QSocketDevice。其实,QT3下提供两种网络访问功能,一类是QFtp, QHttp, QSocket, andQSocketNotifier等,它们都会在接收到数据后,以事件方式进行通知。另一类是QSocketDevice,它不会主动发出任何通知事件,而是必须靠外部程序来查询,或者等待其接收到数据,才能知道何时有数据被收到。《C++ GUI programming with qt3》中的那句话没有错,(但是它是针对QT3说的,在QT4中根本就没有这几个类了,并且QT4中Thread也可以用事件了)。在QT3中,只有 UI线程在可以使用事件,在其它辅助线程中是无法使用的,因此不能使用靠事件进行通知的那几个类了。我的程序中没有使用QSocketNotifier,正如前面说的,这个类只是配合QSocket使用的,它是考事件进行通知的。我的程序使用的是 QSocketDevice,并且靠其Wait功能,来等待数据到达。
&&&&推荐文章:
【上篇】【下篇】生手上路:求高手帮忙解决! QT:想在一个线程的run()函数中调用一个对话框,但是每当程序跑的对话框的show()函数便报错_生手之前对编程无概念现在想转这行,想尽快入门,java ,python,net、php、C之间如_生手作业~求教~__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
生手上路:求高手帮忙解决! QT:想在一个线程的run()函数中调用一个对话框,但是每当程序跑的对话框的show()函数便报错
生手之前对编程无概念现在想转这行,想尽快入门,java ,python,net、php、C之间如
生手作业~求教~
生手上路:求高手帮忙解决! QT:想在一个线程的run()函数中调用一个对话框,但是每当程序跑的对话框的show()函数便报错
新手上路:求高手帮忙解决!!!! QT:想在一个线程的run()函数中调用一个对话框,但是每当程序跑的对话框的show()函数便报错本帖最后由 ayaxiaoxin 于
18:52:59 编辑
程序部分代码如下
void Thread::run()
ThreadDlg *myDlg = new ThreadD \\ThreadDlg是我自己定义的
QDialog的子类
connect(myDlg-&successBtn,SIGNAL(clicked()),\
this,SLOT(successSlot()));
myDlg-&show(); //每次跑到这里就报错!!!!!!!!!!!!
提示错误如下:
[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
blueTeeth: ../../src/xcb_io.c:178: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed.
程序异常终止。
------解决方案--------------------线程内不可以直接调用UI中的控件,可以用信号和槽。
可以看一下:http://www.qtcn.org/bbs/read-htm-tid-53416.html
生手之前对编程无概念现在想转这行,想尽快入门,java ,python,net、php、C之间如
新手之前对编程无概念现在想转这行,想尽快入门,java ,python,.net、php、C之间如java ,python,.net、php、C,小弟有几个问题,麻烦大神帮忙回复下,谢谢
1、这些语言分别代表着哪些技术方向,现在找工作的的话哪个技术方向比较好找工作,如
果想提高更上一个高度,哪个技术方向相对来说门槛较高。
2、新手入从哪门开始比较适合啊,或者说从哪门入手能打好基础,日后入门了想转方向更
3、如果入门后,新手肯定是没有项目经验的,现在的用人单位,对于新手的录用是个什么
标准啊,或者说学到啥程度才能去应聘呢?
4、是自学好还是报个学习班好呢?
5 跪求大神为初学者介绍些入门的学习经验,如何去学习,用什么样的学方法比较好
小弟下定决定转入这行,烦请各位大神不要怕麻烦,望能介绍的详细点,小弟不甚感激!!
------解决方案--------------------1,java,.net是同一类型的语言,目前来看,java在企业级大中型应用上胜于.net,尤其是在j2ee方面,几乎是技术首选,找工作也相对比较容易.python这个语言比较特殊,没用过,但物以稀为贵,想必学好了也很不错.C语言不多说了,如果楼主你够喜欢技术,喜欢计算机底层开发,学C吧,但是付出代价比较大.php做web目前也很火
2,如果你是学生,学校开C语言就是你的入门,当然也有vb的,如果不是学生,要自学的话,C可能会比较难,但是一旦学会C/C++,那其他语言就不值一提了,推荐学java吧,学完直接找工作
3,找工作要笔试和面试,笔试就是你平时学的基础,基础一定要扎实,面试会问你项目经验,其实只要你学的好,随便编个项目经验就行了,做了什么模块,用了什么技术,标准也不是很统一的,如果是初级程序员,那基本上就不会问你太深的问题和太丰富的项目经验
4,如果你喜欢自学,自学也能学好,我是自学的java,半年后找的工作,当时学了javase,spring,hibernate,struts2,js,css,html,jsp,servlet,ejb,oracle,weblogic,tomcat等,基本上每天都会写上千行的代码,尤其是学基础的时候,设计模式我会每一种都敲5遍以上,学到js,html这里的时候,我自己写了个网站,自己用tomcat+花生壳挂起来可以外网访问,就是这个网站是当时面试的筹码,只投了一份简历,面了一家公司,就这样入行了.
5,入门经验,跟着书或者视频资料详细看,边看边动手写,编译,运行,查问题,不懂的暂时略过,第二遍再详尽理解,总结一下,语言一般是掌握基本的语法,然后理解核心特性(比如面向对象)就算学完了. 然后网上找个项目的资料,自己照猫画虎写个小项目,把学到的东西串联一下,有一个整体的认识,这样你会发现学到的东西真的变清晰了,有目的性了,再也不是"水仙花""阶乘""九九乘法表"那些让人迷茫的看不到前途的代码了
6,建议每天学习5个小时以上,重点是写!理解!总结!做记录!
7,这一行还是比较辛苦的
8,但是只要有兴趣,辛苦一点也无所谓啦,反正要做一份工作养活自己嘛
9,祝楼主一路顺风,学业事业有成,看我写了这么多心得体会,楼主把分全散我吧
生手作业~求教~
新手作业~~求教~~1.函数
题目:写一个函数sum(n), 返回值类型为double。对分数序列3/2,
9/4,12/8,
15/16, ……(请自行分析该序列的特点)进行求和。
例如sum(1)=3/2
sum(2)=3/2+9/4
sum(3)= 3/2+9/4+12/8
打印sum(20)和sum(30).
题目:写一个递归函数printNum(n)打印:
printNum(1)
printNum(2)
printNum(3)
printNum(4)
耗了一上午了,还是一点没头绪...T T...求高手指教!!!------最佳解决方案--------------------第一题
#include&stdio.h&
#include&math.h&
sum(int n)
double num=0;
for(i=1;i&=n;i++)
num=(double)3/2;
num+=3*(i+1)/pow(2,i);
scanf("%d",&i);
result=sum(i);
printf("%f",result);
------其他解决方案--------------------第二题
#include&stdio.h&
void printNumber(int n)
for(i=0;i&n;i++)
printf("%d ",n);
printf("\n");
printNumber(n-1);
scanf("%d",&i);
printNumber(i);
------其他解决方案--------------------1.#include&math.h&
for(i=0;i&n;i++)
sum+=(double)(3*(i+1))/pow(2,i+1);
2.void printNum(n)
for(i=0;i&n;i++)
printf("%d ",n);
printNum(n-1);
}------其他解决方案--------------------2.void printNum(n)
for(i=0;i&n;i++)
printf("%d ",n);
printf("\n");
printNum(n-1);
}------其他解决方案--------------------好强!!!但为什么总是生成不成功???------其他解决方案--------------------
好强!!!但为什么总是生成不成功???
for(i=1;i&=n;i++)
num=(double)3/2;
num+=3*(i+1)/pow(2,i);
改成 for(i=0;i&n;i++)
sum+=(double)(3*(i+1))/pow(2,i+1);------其他解决方案--------------------
好呢吧~~~谢谢大神~~~~~~------其他解决方案--------------------
引用:好强!!!但为什么总是生成不成功???
for(i=1;i&=n;i++)
num=(double)3/2;
num+=3*(i……
还想请教大神,我是大一的刚刚接触编程,上课老师讲的和书上写的都大致听得懂看得懂,但要我自己写起来还是无从下手,肿么办呢~~~
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
基于ARMcorte某-A8内核的嵌入式智能家毕业论文.doc30页
本文档一共被下载:
次 ,您可免费全文在线阅读后下载本文档
文档加载中...广告还剩秒
需要金币:100 &&
你可能关注的文档:
··········
··········
青岛农业大学
毕 业 论 文(设计)
目: 基于ARMcortex-A8内核的嵌入式智能家
居系统的设计与开发
理学与信息科学学院
指导教师:
毕业论文(设计)诚信声明
本人声明:所呈交的毕业论文(设计)是在导师指导下进行的研究工作及取得的研究成果,论文中引用他人的文献、数据、图表、资料均已作明确标注,论文中的结论和成果为本人独立完成,真实可靠,不包含他人成果及已获得青岛农业大学或其他教育机构的学位或证书使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。
论文(设计)作者签名:
毕业论文(设计)版权使用授权书
本毕业论文(设计)作者同意学校保留并向国家有关部门或机构送交论文(设计)的复印件和电子版,允许论文(设计)被查阅和借阅。本人授权青岛农业大学可以将本毕业论文(设计)全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本毕业论文(设计)。本人离校后发表或使用该毕业论文(设计)或与该论文(设计)直接相关的学术论文或成果时,单位署名为青岛农业大学。
论文(设计)作者签名:
指 导 教 师 签 名:
日 基于ARMcortex-A8内核的嵌入式智能家居系统的设计与开发
正在加载中,请稍后...

我要回帖

更多关于 qt调用c函数 的文章

 

随机推荐