У меня есть два отдельных проекта С++, которые работают одновременно и обмениваются информацией между собой с использованием TCP/IP. Эти два проекта называются «Мир» и «Платформа». Для отображения данных и вывода в режиме реального времени я создал объект Qapplication внутри класса «Мир». (Я не хочу использовать формы Qt для создания представления QGprahics, я просто хочу его закодировать). TCP/IP работает без проблем. вот мой код:
основной.cpp:
#include "QTcpServer"
#include "QTcpSocket"
#include "QApplication"
#include "QGraphicsScene"
#include "QTime"
World::World()
{
WorldSettings settings;
Sys = new Dynamics(settings);
}
void World::run()
{
while (!time->finished())
{
if (controlStatus)
{
sendWorldData();
getPlatformData();
}
displayData();
}
int World::displayData()
{ char *argv[] = {"a", "arg1", "arg2", NULL};
int argc = sizeof(argv) / sizeof(char*) - 1;
QApplication a(argc, argv);
QGraphicsScene * scene = new QGraphicsScene();
// create an item to put into the scene
QGraphicsRectItem * sag = new QGraphicsRectItem();
sag->setRect(0,0,10,15);
view->show();
return a.exec();
}
при запуске этого файла во время первого шага отображается виджет, а затем программа останавливается (другими словами, программа останавливается на первой итерации). Я ожидаю, что код, который я пишу, будет вести себя следующим образом: сначала отображается виджет, а затем данные отображаются в соответствующих графических элементах, числовых дисплеях и т. д., и в каждой итерации кода эти объекты отображения обновляются. Другими словами, у меня есть программа реального времени, в которой мне нужно отображать выходные данные в реальном времени.
World::run
нигде не вызывается. Кроме того,a.exec()
будет блокироваться до тех пор, пока не произойдет какое-либо событие, которое приведет к выходу из цикла обработки событий. Вы должны попытаться прояснить проблему и предоставить минимально воспроизводимый пример. - person G.M.   schedule 16.05.2020QApplication
предоставляет собственный цикл обработки событий внутриQApplication::exec()
. Он вызывает обработчики событий для соотв. события, которые должны возвращаться как можно быстрее (иначе это приведет к блокировке всего приложения). Обычное решение — либо использоватьQTimer
для таких вещей, как периодическое обновление, либо запускать отдельные потоки (например, используяQThread
). Однако обратите внимание, что Qt также поддерживает TCP/IP с обработчиками событий: QTcpSocket а> - person Scheff's Cat   schedule 16.05.2020QTimer
, Qt doc. обеспечивает, например. Пример аналоговых часов. Для использования QTcpSocket просто перейдите по ссылке. Его док. связывает себя с различными доступными примерами. Для смешивания графического интерфейса сstd::thread
s я недавно написал ответ для SO: как изменить виджеты Qt в потоках WINAPI?. Тем не менее, я бы предотвращал потоки, когда это было возможно. (Они часто вызывают дополнительные проблемы.) ;-) - person Scheff's Cat   schedule 16.05.2020