在不同的线程中启动服务器和IHM

时间:2014-06-26 09:12:47

标签: c++ multithreading qt network-programming

我现在需要你对我正在编码的程序提出建议。首先,让我告诉你它是什么:

我设计了一个带按钮的IHM和类似的东西:

这是我的main windowMain Window

当我点击QButton Supervision时,我正在此窗口中: Supervision Window

IHM完成后,我编写服务器,它工作,并处理帧接收。现在我想做的就是同时服务器和IHM,当我点击监督时,显示服务器在QTableWidget中收到的信息。

为此,我认为我需要:THREADSHARED MEMORY SEGMENTATION

Thread:让服务器和IHM以及Memory Segmentation:给我的IHM提供服务器接收的数据。

我尝试在main window的构造函数中启动服务器,这里是main window中的代码:

//Constructor
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //Start my window (initialisation of button code
...
    //Thread of the server
    std::thread t1(lancerServeur);
    t1.join();


}
//Server function lauch by thread
void MainWindow::lancerServeur(){
Server s;
    while(1){
    s.readData();
    }
}

PROBLEM:服务器启动但不是IHM,我不明白为什么,因为它应该在一个线程中......

您是否也认为共享内存分割是一个好主意?如果是的话,你有一个很好的链接吗?

感谢。

2 个答案:

答案 0 :(得分:2)

由于您的服务器读取线程是无限循环,因此您永远不会退出它。因此,对join的调用永远不会返回。将线程对象存储在成员变量中可确保在超出范围时不会销毁它。

//header file
#include <thread>

class MainWindow : public QMainWindow {
//...

private:
    std::thread m_t1;
};

//source file

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //Start my window (initialisation of button code
...
    //Thread of the server
    m_t1 = std::thread(lancerServeur);
}

如果你只想让一个线程独立运行而不关心它是否可以连接,你也可以决定detach它。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //Start my window (initialisation of button code
...
    //Thread of the server
    std::thread t1 = std::thread(lancerServeur);
    t1.detach();
    //..going out of scope will not destroy the thread
}

答案 1 :(得分:1)

std :: thread :: join()阻塞当前线程,直到t1线程完成执行。

你基本上把自己锁定在t1线程中。

怎么做?

将t1存储在其他地方,以便稍后可以访问它,使用ihm线程等完成你正在做的事情。当你完成所有设置后,访问回t1并调用join()。

我所看到的:

int main()
{
std::cout << "starting first thread...\n";
std::thread t1(foo);

std::cout << "starting second thread...\n";
std::thread t2(bar);

std::cout << "waiting for threads to finish..." << std::endl;
helper1.join();
helper2.join();

std::cout << "done!\n";
}