• 締切済み

スレッドがサスペンドされているか知る方法

スレッドがサスペンドされているか知る方法 こんにちは。 Win32でプログラムしています。 スレッドを作成して、SuspendThread で停止することができますが、ResumeThreadで再開するにあたってスレッドがサスペンドされているか知る方法はあるのでしょうか? 別にフラグを用意しておきべきでしょうか?

みんなの回答

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

このような質問をするときは、何故、そのようにしたいかを書いたほうがいいです。 一般的には、ResumeThread()は実行中に呼び出しても、そのスレッドが 実行中であれば、戻り値0を返し、「実行中でした」という情報を返します。 ということぐらいは、質問者も関数仕様を見て知っているはずです。 つまり、Resumeしたい時には、いつ呼んでも構わないということです。 スレッドの状態を調べたいというのは、何か別の事情があるのでしょうか。

yakionigiriX
質問者

お礼

こんにちは。 言われてみれば全くその通りです。 私が関数仕様書読んでいませんでした。 大変失礼しました。

関連するQ&A

  • スレッドの監視方法について

    現在、pthread_createにてスレッドを生成するプログラムを作成しております。phread_createにてスレッド生成後、生成したスレッドが実行中か判断する方法はないのでしょうか? 大変申し訳ございませんが、ご教授宜しくお願い致します。

  • スレッドの停止方法の確認

    スレッドの停止方法の質問。 停止可能なスレッドを、私は以下のような形で書く事が多いのですが、インターネットで同様な コードを検索すると、2行目の停止フラグの宣言に volatile が無いものが無数に見つかります。 JSR-133 の簡単な解説を読んで、私なりに解釈した結果 volatile は必要と判断したのですが、これは間違いなのでしょうか? volatile は多少重たいので、できれば外したいのですが、 外してよい根拠が見つかりません。 真偽をご存知の方、よろしくお願い致します。 class MyThread extends Thread { private volatile boolean done = false; public void terminate(){ done = true; interrupt(); } public void run(){ while(!done){ //処理 } } }

    • ベストアンサー
    • Java
  • Studio2008でのスレッドの挿入方法

    Studio2008でのスレッドの挿入方法 VisualC++2008を使っている初心者です。 フォームプログラム上にRS232Cの通信を入れたいと考えていて、 スレッドを使ってプログラムを作ろうと考えているのですが、 スレッドクラスなどは、ボタンやテキストボックスみたいにツールから簡単に作成できるのものではないのでしょうか? (ひょっとしたら簡単に基本的なスレッドを挿入する方法があるかと思いました。) もしなければ、Studioのtoolメニューからどのように作成していくものなのでしょうか? それとも全て自分でソースにコードを挿入する必要があるのでしょうか? 基本的なことから始めますので、簡単な挿入方法があるのなら教えてください。 (サイトで見かけるスレッドのサンプルコードはなかなかイメージがわいてきません)

  • VC++2005のスレッド使用方法について

    現在、VC++2005 SP2にてDLLを作成しています。 DLLには一つスレッドがあり、開始関数が実行されれば、スレッドが起動。終了関数を実行すればスレッドを停止させたいと思っております。 関数を分けていますので、以下の内容をグローバルで宣言したいと考えています。 Thread^ oThread = gcnew Thread( gcnew ThreadStart( &CUart::ThreadProc ) );                                     ~~~~~~~~~~~~~~~~~~~~~~~~                                         実行関数です。 oThread->Start();  //開始関数のスレッド開始  oThread->Abort();  //終了関数のスレッド停止 現在、宣言をグローバルのところに配置して、ビルドすると エラー 1 error C3145: 'oThread' : グローバルまたは静的変数は、マネージ型 'System::Threading::Thread ^' を含むことはできません とエラーが発生してしまいます。 いろいろ調べましたが、なかなか進んでいない状態です。 使用方法が間違っているのでしょうか?申し訳ありませんが、教えてください。 もし、別の方法があればご教授願います。 よろしくお願いします。

  • スレッド

    スレッドを生成し、データのやり取りを行うプログラムを作成しようとしているのですが、使用関数が分かりません。 どなたか、ご存知でしたら、お教えください。 スレッドの作成関数はpthread_createを使うことは分かりました。 そこからデータを送る、受けるのやり方がわかりません。 プログラムの流れ スレッドを生成し、スレッドにデータを送る。 そのスレッド内で、データを調べ期待値だったらACK、 それ以外だったら、errorを返すといった感じです。 まだスレッドに関して知識が薄い為、質問も分かりづらいと思いますが、宜しくお願い致します。

  • スレッドの再開

    MFCでアプリケーションを開発しています。 メインのプログラムを走らせながら計算処理を行いたくて、本やネット等のサンプルプログラムを見ながら別スレッドを生成してみました。 OnInitDialog()でイベントとスレッドを生成し、スタートボタンのクリック押下をトリガーとして、計算処理(Run())を呼んでいます。 タイマー開始後は一定時間ごと(サンプルでは500msec)にスレッドを再開して計算処理を実行し、計算処理完了後はスレッドを一時停止状態にしたいと思っています。 (アプリケーション起動時にサスペンドモードで起動したスレッドをボタン押下でResumeThread(再開)し、あとはタイマーでイベントシグナルをセットして制御するつもりでした。) ですが、下記のコードで走らせると、初回のみ計算処理が呼び出され、その後はスレッドが再開されません(ThreadProc()がコールされない)。 理解不足から何か考え違いをしているのだと思うのですが、どこをなおすべきかわからず行き詰まっています。 どなたかご指摘頂けたらと思います。よろしくお願い致します。 ※実際に記述したコードの抜粋になりますので計算やリソースの解放処理等は省略しています。 OS:Win10 開発環境:VisualStudio2015 C++ ---------------------------------------------------------------- BOOL CMFCApplication1Dlg::OnInitDialog() { CDialog::OnInitDialog(); 中略 … m_hEvent = CreateEventA(NULL, FALSE, FALSE, "EVENT"); m_hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)this, CREATE_SUSPENDED, NULL); return TRUE; } void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent) { switch(nIDEvent) { case 1: { BOOL blRet = SetEvent(m_hEvent); } break; default: { } break; } CDialog::OnTimer(nIDEvent); } UINT CMFCApplication1Dlg::ThreadProc(LPVOID pParam) { CMFCApplication1Dlg* pDlg = dynamic_cast<CMFCApplication1Dlg*>(reinterpret_cast<CWnd*>(pParam)); if(pDlg) { pDlg->ThreadProcCall(); } return 0; } // LineProfileスレッド処理呼び出し. void CMFCApplication1Dlg::ThreadProcCall(void) { // イベントオブジェクト取得. HANDLE h = OpenEventA(EVENT_ALL_ACCESS, FALSE, "EVENT"); // シグナル状態になるまで待機. WaitForSingleObject(h, INFINITE); // 非シグナル状態に. ResetEvent(h); // 計算処理呼び出し. Run(); this->SendMessage(WM_USER_COMPLETE_PROC); } void CMFCApplication1Dlg::Run(void) { // 計算処理. } // LineProfileスレッド終了後処理. afx_msg LRESULT CMFCApplication1Dlg::OnCompleteProc(WPARAM wParam, LPARAM lParam) { // スレッド停止. DWORD dwRet = SuspendThread(m_hThread); return 0; } void CMFCApplication1Dlg::OnBnClickedBtnStart() { // スレッド再開. DWORD dwRet = ResumeThread(m_hThread); // 計算処理呼び出し用タイマー設定. m_nUpdatePaintTimer = SetTimer(1, 500, NULL); }

  • Windowsのスレッドの名称

    Windowsで作成されるスレッドの呼称が正式になんと呼ばれているのか判らず困っています。 僕はこれまで「Win32 API Thread」と呼んでいましたが、先輩は「Win32 Thread」と呼んでいました。さらに知人には「Windows Thread」や「Windows Native Thread」と呼ぶ人もいます。googleで検索したところ、件数に差異はあってもどの呼称も使用している人は少なからずいるようです。 例えばpthreadのように、設計書のような正式なドキュメントに記載するときはどの呼称が正しいのでしょうか?それとも別の正式呼称があるのでしょうか?

  • ソケットプログラミングとスレッドについて

    TCP/IPソケットを用いた通信プログラムを作成しています。その上でacceptする処理を専用スレッドにしており、accept後の受信処理をまた別のスレッドで処理しています。コンソールプログラムにおいてサーバとクライアントを用意しテストをしてみるとうまくいくのですが、MFCプログラムにおいて同じネットワーク処理を行ってみると、サーバ側へのconnectは成功するのですが、クライアント側からsendしたときにサーバ側でrecvの戻り値が必ず0にしかならず切断された状態になってしまいます。これはどういったときに発生すると考えられるでしょうか?ちなみにMFCが絡んでいるかどうかということは特にわかっておりません。 どなたかこのような経験をお持ちであればご教授お願い致します。

  • スレッドの扱い方

    javaの初心者です。 質問ですが、 スレッドを使って再生ボタンを押すと画像が動き出すプログラムを作成しています。再生ボタンを押すとスレッドを立ち上げるようにしているのですが、再生ボタンを2回以上押すとどんどん画像の動くスピードが速くなってしまい困ってます。 ボタンが押されるたびにスレッドが立ち上げられているからだと思うのですが、どうしたら初期の状態に戻すことができるか教えていただけないでしょうか?

  • ハードウェアスレッドの割り当て方法

    ハードウェアスレッドがある環境で、win32APIを用いて、スレッドを特定のプロセッサに割り当てる方法を探してます。 イメージとしては.Netで言うところのThread.SetProcessorAffinityのようなものです。 ご存知の方、ご教授お願いします。 環境はXP,VC8です。