我现在需要你对我正在编码的程序提出建议。首先,让我告诉你它是什么:
我设计了一个带按钮的IHM和类似的东西:
这是我的main window
:
当我点击QButton Supervision
时,我正在此窗口中:
IHM完成后,我编写服务器,它工作,并处理帧接收。现在我想做的就是同时服务器和IHM,当我点击监督时,显示服务器在QTableWidget中收到的信息。
为此,我认为我需要:THREAD
和SHARED 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,我不明白为什么,因为它应该在一个线程中......
您是否也认为共享内存分割是一个好主意?如果是的话,你有一个很好的链接吗?
感谢。
答案 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";
}