4

私のプロジェクトの 1 つで、同時に 2 つの操作 (開く操作と閉じる操作) を実行する必要があります (つまり、並列/同時)。次のように、それぞれの操作に対して 2 つのスレッドを作成しました。

UINT MyThread1(LPVOID lParam)
{
 // code for Open Operation..
 // other stuffs...

 return(1);
}

UINT MyThread2(LPVOID lParam)
{
 //Code for Close Operation..
 //Other Stuffs..

return(1);
}

void CMyProject : OnbnClickedOpen()
{
   // Here am running OPen Operation Continously..
 while(1) {
 AfxBeginThread(MyThread1,0);
 }
 }

void CMyProject : onbnClickedClose()
{
  //Here am running Close Operation continously...
  while(1) {
  AfxBeginThread(MyThread2,0);
 }
}

ここでは、スレッドを連続して実行できません。私はこのような別の方法を試しました:

void CMyProject : OnbnClickedOpen()
{
   while( 1 )
   {
     //Code for Open Operation..
   }
 }

void CMyProject : onbnClickedClose()
{
  while(1)
  {
    //Code for Close Operation..
  }
}

これにより、Open Operation Continuously または Close Operation Continuously のいずれかを実行できますが、同時に両方を実行することはできません。

これを行う方法を提案/ガイドしてください..

ありがとう。

4

3 に答える 3

4

whileループをスレッド関数に移動します。

UINT MyThread1(LPVOID lParam)
{
 // Here am running OPen Operation Continously..
 while(1) {
   // code for Open Operation..
   // other stuffs...
 }

 return(1);
}

UINT MyThread2(LPVOID lParam)
{
  //Here am running Close Operation continously...
  while(1) {
   //Code for Close Operation..
   //Other Stuffs..
  }

return(1);
}

void CMyProject : OnbnClickedOpen()
{
 AfxBeginThread(MyThread1,0);
}

void CMyProject : onbnClickedClose()
{
  AfxBeginThread(MyThread2,0);
}
于 2013-01-15T10:21:44.873 に答える
0

while(1)問題は、これらの個別のスレッド内ではなく、メイン スレッド自体内で無限ループを呼び出していることです。したがって、メイン スレッドでこの無限に入るとすぐに、実行が継続され、他のコードは実行されません。

無限ループをそれぞれのスレッドに移動する必要があります。コード全体を while ループでラップすると、無限に実行できますが、メイン スレッドからは分離されます。したがって、メイン スレッドの実行がブロックされることはありません。

于 2013-01-15T10:21:49.100 に答える
0

:*D、お見逃しなく。エンドレス ループがプロセッサの使用をフックアップし、コンピュータ リソース (RAM/メモリ/..) を消費する可能性があります。バックグラウンド ワーカーは、エンドレス ループのような特定の時間のかかるタスク用に設計されます。常に仕事を続けているため、コンピュータの PnP デバイスなどは、コンピュータでスタンドを取得できない場合があります。実行中のタスクがジョブを完了するまで、コンピューターがフリーズすることがあります。したがって、バックグラウンド スレッドには、バックグラウンド ワーカーを含む while ループではなく、while ループを含める必要があります。

于 2013-01-15T10:29:49.520 に答える