2012-09-29 6 views
0

내 임무는 bottler 프로세스를 시뮬레이션하는 것입니다.두 스레드를 동시에 실행할 수 있습니까? Qt C++

"병"을 대기열에 넣는 사람이 있습니다. 예를 들어 그의 속도는 초당 1 병입니다. 나는 실로 이것을했다. 하지만 문제는 두 번째 스레드가 있어야한다는 것입니다.이 머신은 이러한 "병"을 가져 와서 대기열에서 빼낸 다음 다시 다른 대기열에 넣는 기계입니다.

'main'함수에서 대기열과 스레드를 생성하여이 작업을 수행했습니다. 그런 다음 스레드를 시작하고 매개 변수로 방금 작성한 대기열을 입력했습니다. 이 방법으로 스레드 (이 경우, 사람)는 매개 변수로 전달 된 대기열에 "병"을 넣습니다.

그런 다음 프로그램을 실행하면 is는 작동하지만 실제로는 작동하지 않습니다. 첫 번째 스레드 (사람)가 요소를 큐에 넣기 시작하고 완료되면 두 번째 스레드 (시스템)가 큐 요소를 제거하기 시작합니다.

내 프로그램에서 수행하고자하는 작업은이 두 가지 작업을 동시에 수행하는 것입니다. 즉, 사람 (첫 번째 스레드)이 요소를 대기열에 넣기 시작하면 컴퓨터 (두 번째 스레드)가 제거되기 시작합니다. 그들 큐에서. 여기

내 코드의 일부입니다 :

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

"Thread"클래스의 이름을 지정해도 다중 스레드되지 않습니다. 적절한 멀티 스레딩을 위해 [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 인이 내용을 읽는 것이 좋습니다.이 내용은 필요한 내용과 거의 동일합니다.

관련 문제