0

我的任务是模拟装瓶过程。

有一个人负责将“瓶子”排成一列。例如他的速度是每秒1瓶。我用线程做到了这一点。但问题是必须有第二个线程,这将是一台机器,负责取出这些“瓶子”并将它们出列,然后将它们放入另一个队列。

我通过在“主”函数中创建队列和线程来做到这一点。然后我启动线程,并作为参数进入我刚刚创建的队列。这样,线程(在本例中为人)将把“瓶子”放入作为参数传递的队列中。

然后当程序运行时,它确实可以工作,但不是应该的。第一个线程(人)开始将元素放入队列,当它完成时,第二个线程(机器)开始删除队列中的元素。

我想要我的程序做的是同时执行这两个任务,这意味着一旦人(第一个线程)开始将元素放入队列中,机器(第二个线程)就开始从队列中删除它们.

这是我的一些代码:

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();
}

这是线程的一些代码

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);
}
}

关于这两个线程如何同时工作的任何想法?感谢您的帮助和想法,我非常感谢他们。

4

2 回答 2

2

您要实现的是生产者-消费者。我的建议是完全忘记您所做的并开始阅读文档:Qt中的线程支持,您已证明完全跳过了该文档。

还可以考虑阅读这个,这是Qt中生产者-消费者的示例,几乎与您需要的相同。

于 2012-09-30T09:50:18.613 回答
2

您实际上根本没有使用线程。我从未使用过 Qt,所以我不能(或不会)尝试修复整个程序,但根据文档,您必须启动一个线程才能使其运行。然后它将执行它的运行方法,你必须实现它——你的循环可能应该进入这个“运行”方法。

您正在做的是创建休眠线程对象,然后您只需从主线程调用线程函数。该线程永远不会运行,并且这些方法在您的主线程上按顺序运行。

为了正确操作,您可能必须保护对队列的访问,因此一次只能使用一个线程(除非队列是线程安全的,但大多数库都没有尝试这样做)。对于一些额外的研究,像您正在制作的消息传递队列通常受到条件锁的保护,因为它允许诸如“等到队列中有东西”之类的操作。

于 2012-09-30T09:42:46.270 回答