многопоточность — Как я могу запустить два потока одновременно? Переполнение стека Qt

Моя задача — смоделировать процесс розлива.

Есть человек, который отвечает за постановку «бутылок» в очередь. Например, его скорость составляет 1 бутылку в секунду. Я сделал это с резьбой. Но проблема в том, что должен быть второй поток, это будет машина, которая будет отвечать за то, чтобы взять эти «бутылки» и снять их с очереди, а затем поместить их в другую очередь.

Я сделал это, создавая очереди и потоки в функции ‘main’. Затем я запустил поток, и в качестве параметра я вошел в очередь, которую я только что создал. Таким образом, поток (в данном случае человек) поместит «бутылки» в очередь, переданную в качестве параметра.

Затем, когда программа запускается, она работает, но не так, как должно быть.
Первый поток (человек) начинает помещать элементы в очередь, а когда он заканчивается, второй поток (компьютер) начинает удалять элементы очереди.

Я хочу, чтобы моя программа выполняла эти две задачи одновременно, это означает, что как только человек (первый поток) начинает помещать элементы в очередь, машина (второй поток) начинает удалять их из очереди. ,

Вот часть моего кода:

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

Queue *queue1 = new Cola (""); // First queue
Thread *Person = new Thread (); // Person who is in charged of putting bottles
Thread *Machine = new Thread (); // Machine in charged of removing elements of the queue

Person->queue(queue1);
Machine->dequeue(queue1);

system("Pause");
return 0;

return a.exec();
}

и вот часть кода Thread

void Thread::queue(queue *c)
{

for (int i = 0; i < 10; i++)
{
c -> push (i);
cout << "Inserting to the queue the: " << i << endl;
this -> sleep (1);
}
}

void Thread::dequeue(queue *c)
{

while (!c -> empty())
{
c -> pop ();
this -> sleep (2);
}
}

Любые идеи о том, как эти две темы могут работать одновременно?
Спасибо за вашу помощь и идеи, я очень ценю их.

0

Решение

Вы на самом деле не используете темы вообще. Я никогда не использовал Qt, поэтому я не могу (или не буду) пытаться исправить всю программу, но в соответствии с документами, которые вы должны Начните поток, чтобы заставить это бежать. Затем он выполнит это бежать метод, который вы должны реализовать — ваш цикл, вероятно, должен войти в этот метод «run».

То, что вы делаете, это создаете неактивные объекты потока, а затем просто вызываете функции потока из основного потока. Поток никогда не запускается, а методы запускаются последовательно в вашем основном потоке.

Для корректной работы вам, вероятно, придется защитить доступ к своей очереди, поэтому только один поток может использовать его за один раз (если очередь не является потокобезопасной, но большинство библиотек не пытаются это сделать). Для некоторых дополнительных исследований очереди передачи сообщений, подобные той, которую вы создаете, обычно защищены блокировкой условий, поскольку это позволяет выполнять такую ​​операцию, как «ждать, пока что-то окажется в очереди».

2

Другие решения

То, что вы пытаетесь реализовать, это производитель-потребитель. Мой совет — полностью забыть о том, что вы сделали, и начать читать документацию: поддержка потоков в Qt, который вы доказали, что полностью пропустили.

Также подумайте о том, чтобы прочитать это, что является пример производителя-потребителя в Qt, который практически идентичен тому, что вам нужно.

1

По вопросам рекламы [email protected]