0

私の仕事は、ボトラー プロセスをシミュレートすることです。

「びん」を列に並べる担当者がいます。たとえば、彼の速度は毎秒 1 本です。これをスレッドで行いました。しかし問題は、2 番目のスレッドが必要だということです。これは、これらの「ボトル」を取得してキューから取り出し、別のキューに入れることを担当するマシンになります。

これは、「main」関数でキューとスレッドを作成することで行いました。次に、スレッドを開始し、パラメーターとして、作成したばかりのキューを入力しました。このようにして、スレッド (この場合は人) は「ボトル」をパラメーターとして渡されたキューに入れます。

その後、プログラムが実行されると、動作しますが、本来の動作ではありません。最初のスレッド (人) が要素をキューに入れ始め、それが終了すると、2 番目のスレッド (マシン) がキューの要素を削除し始めます。

私がプログラムに実行させたいのは、これら 2 つのタスクを同時に実行することです。これは、人 (最初のスレッド) が要素をキューに入れ始めるとすぐに、マシン (2 番目のスレッド) がそれらをキューから削除し始めることを意味します。 .

これが私のコードの一部です:

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

これら 2 つのスレッドがどのように同時に機能するかについてのアイデアはありますか? あなたの助けとアイデアに感謝します。本当に感謝しています。

4

2 に答える 2

2

実際にはスレッドをまったく使用していません。私は Qt を使用したことがないので、プログラム全体を修正することはできません (または修正しません) が、ドキュメントによると、実行するにはスレッドを開始する必要があります。次に、実装する必要があるrunメソッドを実行します。ループは、おそらくこの「run」メソッドに入る必要があります。

あなたがやっていることは、休止状態のスレッド オブジェクトを作成することです。次に、メイン スレッドからスレッド関数を呼び出すだけです。スレッドは実行されず、メソッドはメイン スレッドで順番に実行されます。

正しく操作するには、おそらくキューへのアクセスを保護する必要があるため、一度に 1 つのスレッドしか使用できません (キューがスレッドセーフでない限り、ほとんどのライブラリはそれを試みていません)。いくつかの追加の調査のために、作成しているようなメッセージパッシングキューは通常、条件ロックによって保護されています。これにより、「何かがキューに入るまで待機する」などの操作が可能になります。

于 2012-09-30T09:42:46.270 に答える
2

実装しようとしているのは、生産者と消費者です。私のアドバイスは、あなたがしたことを完全に忘れて、ドキュメントを読み始めることです: Qt のスレッドサポート 、完全にスキップしたことが証明されました。

これは、 Qtのプロデューサー/コンシューマーの例であり、必要なものとほぼ同じです。

于 2012-09-30T09:50:18.613 に答える