• 4105阅读
  • 6回复

[提问]在多线程中对主界面的控件进行操作有问题了?如何保护可能出现的同时操作? [复制链接]

上一主题 下一主题
离线dolphin836
 

只看楼主 倒序阅读 楼主  发表于: 2012-02-09
我的程序中有一个串口子线程  会一直运行  

当它收到从串口发送来的某个命令后就会执行相应的操作

例如:收到一个曝光超时命令  

我会在串口线程中将主界面上的一个控件变红   以提示用户

如果用户在主界面此时也是操作这个控件   会出现什么问题

我的程序有时候会出现死机    不知道有没有可能是这个问题

用什么办法解决?
离线jdwx

只看该作者 1楼 发表于: 2012-02-09
回 楼主(dolphin836) 的帖子
用信号和槽能解决问题。
要修改控件时发射信号。
要是在线程内直接修改控件,不知道会出什么奇怪的问题。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线dolphin836

只看该作者 2楼 发表于: 2012-02-09
回 1楼(jdwx) 的帖子
我的界面是用QT设计器画的  槽函数也是在里面添加的

编译后通过看对应的.h文件,发现所有添加的槽函数都在.h文件中有声明

那么在设计器中如何添加信号函数呢?

还是需要手动修还.h文件来添加?

信号函数在.h文件中应该是:
signal:
        void test(int);
槽函数应该是:
public solt:
      void test1(int);
对么?
我的QT是3.3.8
离线jdwx

只看该作者 3楼 发表于: 2012-02-09
回 2楼(dolphin836) 的帖子
QT是3.3.8的信号和槽不支持多线程,只能发送自定义事件。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线dolphin836

只看该作者 4楼 发表于: 2012-02-09
回 3楼(jdwx) 的帖子
其实我要实现的功能很简单的   就是用户点击copy按键后把图片复制到U盘

但是不能影响用户其他操作

我在main函数开启一个多线程  专门负责拷贝工作  

用户按键后把标志位改为1

代码如下:帮我看下  谢谢了
CopyThread.h:
****************************************************

#include <qthread.h>
#include <GlobalVariable.h>

class MyThread : public QThread {

    public:

        virtual void run();

    };

    void MyThread::run()
    {
    char tempS[100];
    QString strTemp;

    while(1)
    {
            if(1==CopySign)
          {
                cout<<"copy images ..."<<endl;
            sprintf(tempS,"cp -r /tmp/hardfile/5/usb/* /tmp/usb/");
            system(tempS);
            system("sync");
                strTemp = "umount /tmp/usb";
                  system(strTemp.data());
            cout<<"copy over ..."<<endl;
            mainWin18->ShowTimer();
//                   QMessageBox::warning( mainWin10, "USB", "\n The images is copy over ,you can move udisk ! \n","OK", 0) ;
            CopySign=0;
          }      
    }
  }

**************************************************************
Copyover.ui.h:
#include <GlobalVariable.h>

void Copyover::Show()
{
    cout<<"void Copyover::Show()"<<endl;
    if(mainWin18 != NULL)
    {
        delete mainWin18;
        mainWin18 = NULL;
    }  
    mainWin18= new Copyover;
    mainWin18->move(352, -52);
    mainWin18->show();
}

void Copyover::ShowTimer()
{
    cout<<"Copyover::ShowTimer"<<endl;
    QTimer::singleShot( 0, this, SLOT(Show()) ); //clicked
}

现在程序运行到mainWin18->ShowTimer();就死机了

单触发定时器 我在程序中其他地方都用过 没什么问题的  这里不知道为什么不行了

其实简单点用messagebox就可以了 ,但是messagebox弹出来后不能点击  不知道怎么自动消失?

离线jdwx

只看该作者 5楼 发表于: 2012-02-09
回 4楼(dolphin836) 的帖子
如果就这么简单,提供一个简单思路:
主线程里用一个定时器,每隔100ms检查一下线程finished了没有,
弹出QMessagebox,这样就能点QMessagebox了。
用下面的函数检查finished了没有:
bool QThread::isFinished () const
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线dolphin836

只看该作者 6楼 发表于: 2012-02-09
回 5楼(jdwx) 的帖子
主线程没有在while(1)里面啊  
在main中开启一个串口线程 和一个拷贝线程

就new出来图形界面  每一个操作都是槽函数响应的

快速回复
限100 字节
 
上一个 下一个