2012-09-29 75 views
0

我的任務是模擬灌裝過程。如何在同一時間運行兩個線程? Qt C++

有人負責將「瓶子」放入隊列中。例如他的速度是每秒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(); 
} 

,這裏是一些主題

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

只是命名一個類「線程」並不會使其成爲多線程。嘗試使用[QThread](http://doc.qt.digia.com/stable/qthread.html)進行適當的多線程。 – Cornstalks

+0

你用什麼來保護你的堆棧免受併發訪問?你不應該有一些互斥體來保護隊列嗎? – HeatfanJohn

回答

1

你實際上並沒有使用線程。我從來沒有使用Qt,所以我不能(或不會)嘗試修復整個程序,但根據文檔,您必須使用start一個線程來運行它。然後它會執行它的run方法,你必須實現 - 你的循環應該可能進入這個「運行」方法。

你在做什麼是創建休眠線程對象,然後你只需要調用你的線程功能,從你的主線程。該線程從不運行,並且這些方法在主線程上依次運行。

正確操作,你可能要保護訪問您的隊列,所以只有一個線程可以在同一時間使用它(除非隊列是線程安全的,但大多數圖書館都沒有試圖這樣做)。對於一些額外的研究,消息傳遞隊列(如您正在創建的消息傳遞隊列)通常受到條件鎖的保護,因爲這允許執行諸如「等到隊列中有東西」之類的操作。

0

你試圖實施的是生產者 - 消費者。我的建議是完全忘記你已經完成了什麼,並開始閱讀文檔:thread support in Qt,你已經完全跳過了。

還要考慮讀這篇文章,這是Qt的一個example of producer-consumer,這幾乎等同於你所需要的。

相關問題