我的任务是模拟装瓶工艺。
有一个人负责将“瓶子”放入队列中。例如,他的速度是每秒1瓶。我用一个帖子做了这个。但问题是必须有第二个线程,这将是一个机器谁将负责采取这些“瓶子”并将它们出列,然后将它们放入另一个队列。
我是通过在'main'函数中创建队列和线程来实现的。然后我启动了线程,作为参数,我进入了刚刚创建的队列。通过这种方式,线程(在本例中为person)将“瓶子”放入作为参数传递的队列中。
然后当程序运行时,它确实有效,但不是应该的。 第一个线程(人)开始将元素放入队列,当它完成时,第二个线程(机器)开始删除队列的元素。
我希望我的程序要做的是同时执行这两项任务,这意味着只要人(第一个线程)开始将元素放入队列,机器(第二个线程)就会开始删除它们从队列中。
以下是我的一些代码:
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 :(得分:2)
你根本没有使用线程。我从来没有使用过Qt所以我不能(或不会)尝试修复整个程序,但是根据文档你需要start一个线程来运行它。然后它将执行它的run方法,你必须实现它 - 你的循环应该进入这个“运行”方法。
您正在做的是创建休眠线程对象,然后您只需从主线程调用线程函数。线程永远不会运行,并且方法在主线程上按顺序运行。
为了正确操作,您可能必须保护对队列的访问,因此一次只有一个线程可以使用它(除非队列是线程安全的,但大多数库都没有尝试这样做)。对于一些额外的研究,像你正在制作的消息传递队列通常受条件锁保护,因为它允许诸如“等到队列中的某些东西”之类的操作。
答案 1 :(得分:1)
您尝试实施的是生产者 - 消费者。我的建议是完全忘记你已完成的工作并开始阅读文档:thread support in Qt,你已经完全跳过它。
还要考虑阅读这个,这是Qt中的example of producer-consumer,几乎与你需要的相同。