- ベストアンサー
スレッドが作れない
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
&外す さらにunsigned int __stdcall Process(void *dummy) 関数定義は合わせる、余計なキャストは入れない
関連するQ&A
- C++ GUIのメッセージループ。
初心者です。 よろしくお願いします。 とても重く時間の掛かる処理を色んなサイトを参考にスレッドにしてみたんですけど、書き方が悪いのか、再描写がワンテンポ遅れたり、アプリケーションを複数起動したりするとフリーズしてしまったりします。 原因はメッセージループにあるような気がしてるんですが、この書き方はおかしいですか?? どのサイトから引用したのかわからなくなってしまいました。 気付いたことなどあったら何でもいいので教えて貰えたら嬉しいです!よろしくお願いします!! thread01に重い処理が書かれてます。 int thread_call() { unsigned int dwThreadId[1]; HANDLE hThread[0] = (HANDLE)_beginthreadex( NULL, 0, ( unsigned int (__stdcall*)(void*) )thread01, NULL, 0, &dwThreadId[0] ); MSG msg; DWORD dwRet = WAIT_TIMEOUT; while ( 1 ) { dwRet = ::MsgWaitForMultipleObjects( sL, hThread, FALSE, INFINITE, QS_ALLEVENTS ); if ( dwRet == WAIT_OBJECT_0 + sL ) { if ( ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) { ::TranslateMessage( &msg ); ::DispatchMessage( &msg ); } } else if ( dwRet >= WAIT_OBJECT_0 && dwRet < WAIT_OBJECT_0 + sL ) break; } CloseHandle( hThread[0] ); hThread[0] = NULL; }
- ベストアンサー
- C・C++・C#
- (マルチスレッド)_beginthreadexに複数の引数を渡す
現在プログラムでマルチスレッドをやろうとしているのですが、 マルチスレッドの関数に数値や配列などの引数を渡すことは可能でしょうか? MSDNで調べてみると、_beginthreadex関数の4番目のNULLのところに引数リストを 指定できるとあったのですが、その意味が良くわかりませんでした。 以下のプログラムの場合にマルチスレッドに変数a, b, cを引数として渡したい場合は どのように書けばいいのでしょうか? #include <stdio.h> #include <windows.h> #include <process.h> unsigned WINAPI MyThread( void *lpx ){ while (1) { printf("スレッド実行中\n"); Sleep(1000); } return 0; } void main(){ // スレッドに渡したい変数の宣言 int a = 128; int b = 256; int c = 512; // スレッドIDの宣言 DWORD thID; // マルチスレッドの開始 (HANDLE)_beginthreadex( NULL, 0, &MyThread, NULL, 0, (unsigned int*)&thID ); // ループ while (1) { printf("メイン関数実行中\n"); Sleep(2000); } }
- ベストアンサー
- C・C++・C#
- _beginthreadexについて
CreateProcessで作成したプロセスに対して(process_info) beginthreadexで(1)のようにスレッドを生成した場合、 (2)のWaitForSingleObjectがうまく動作しません。スレッドが そこで終了してしまいます。しかし、(3)を(1)の後に挿入してあげると WaitForSingleObjectがうまく動作します。 このような現象について解決方法、もしくは推測などよいので ご教授願います。 (1) (HANDLE)_beginthreadex(NULL, 0, testThread, process_info, 0, &threadID); (2) static unsigned __stdcall testThread(void* args){ WaitForSingleObject(process_info.hProcess, INFINITE); } (3)sleep(5000);
- 締切済み
- C・C++・C#
- _beginthread関数の引数
VC++ 2005 Win32コンソールアプリケーション で 1つ目のスレッドで「10」 2つ目のスレッドで「20」 3つ目のスレッドで「30」 と出力するために下記のように記述しました。 結果は予定通り出力されているのですが、 _beginthreadの第3引数の渡し方、 printfの引数の表示の仕方はこれでよいのでしょうか? void myThread(void *pParam); int arg[3] = {10, 20, 30}; int main() { HANDLE hThread[3]; int i; for (i = 0; i < 3; i++) { hThread[i] = (HANDLE)_beginthread(myThread, 0, &arg[i]); } /* 以下略 */ } void myThread(void *pParam) { printf("%d\n", *(int *)pParam); _endthread(); }
- ベストアンサー
- C・C++・C#
- windowsのプロセスIDやスレッドIDの使い道
win32APIで取得したプロセスIDやスレッドIDの使い道について教えてください。 CreateProcessなどで取得したプロセスのハンドルやスレッドのハンドルはwin32APIで使う場面がありますが、プロセスIDやスレッドIDの使い道がわかりません。 どのような場面でプロセスIDやスレッドIDを使うのでしょうか?具体的にこんな事をするときに使うよなどあれば教えていただきたいです。 プロセスIDやスレッドIDを引数にとるAPI関数などがあれば教えていただきたいです。
- ベストアンサー
- その他(プログラミング・開発)
- 既存プロセスからプロセスのプライマリースレッドIDの取得方法
いつもお世話になってます。 プロセスに関することで分からないことがあるため、どなたか御教授して下さい。 只今、VC++で開発を行っているのですが、CreateProcess関数を使用して開始したプロセスの情報が、引数で指定したPROCESS_INFORMATIONにプライマリースレッドのハンドルやIDが設定されるのは知っているのですが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能でしょうか? 具体的には、動作中のプロセスIDを指定するとそのプロセスのプライマリースレッドに対してPostThreadMessageで任意のメッセージが送れるという仕様です。 対象のプロセスがウィンドウを持っていれば、EnumWindows関数を使用してウィンドウに対してPostMessageができるというのは分かったのですが、今回対象のプロセスがウィンドウを持たない為、上記のようにスレッドに対してメッセージを送るようになっています。 CreateProcess呼び出し時にはスレッドIDが取得できることから、プロセスID、または、プロセスハンドルからスレッドIDが取得できるのではないかなと考えられるんですが。。。。
- ベストアンサー
- C・C++・C#
- マルチスレッドプログラム
いつもお世話になっております。 今回はマルチスレッドプログラムについてお聞きしたいです。 マルチコアCPUを使ってたとえば下記のようなことをしたいときに for (int i = 0; i < 1000000; i++) { sum += i; } このまま計算するよりもいくつかスレッドを作って、計算量を分散させてから最後に足してやるほうが早いと思いまして、 現在Core2Quadが手元にありましたのでスレッドを4つ作って スレッド1で0から250000まで スレッド2で250001から500000まで スレッド3と4も同様にして実際にやってみたのですが スレッドなしの状態よりも倍くらい時間がかかってしまうようになってしまいました。 計算結果は同じになり、CPU使用率もシングル時が25%、マルチ時が100%になっているので意図したようにはできていると思います。 GetProcessAffinityMaskを使って、各スレッドにひとつづつコアを割り当てても同様でした。 実際に時間が4分の1に近くなると思っていたのですが2倍かかってしまったので不思議です。 どなたか上記のことを思惑通りに動かせそうな方法をご存知の方はご教授願います。 プログラムは全部は無理ですが重要そうなところは下記のとおりです。 スレッド作成部分 { DWORD dwStart = ::timeGetTime(); _thread_handle[0] = (HANDLE)::_beginthreadex(NULL, 0, thread_first, NULL, CREATE_SUSPENDED, &_thread_first_id); _thread_handle[1] = (HANDLE)::_beginthreadex(NULL, 0, thread_second, NULL, CREATE_SUSPENDED, &_thread_second_id); _thread_handle[2] = (HANDLE)::_beginthreadex(NULL, 0, thread_third, NULL, CREATE_SUSPENDED, &_thread_third_id); _thread_handle[3] = (HANDLE)::_beginthreadex(NULL, 0, thread_forth, NULL, CREATE_SUSPENDED, &_thread_forth_id); for (int num = 0; num < 4; num++) { ::ResumeThread(_thread_handle[num]); } ::WaitForMultipleObjects(4, _thread_handle, TRUE, INFINITE); for (num = 0; num < 4; num++) { ::CloseHandle(_thread_handle[num]); } DWORD dwEnd = ::timeGetTime(); } 各スレッド部分 { HANDLE hCurrent = ::GetCurrentProcess(); DWORD pamask, samask, patmp = 0; int nRet = ::SetProcessAffinityMask(hCurrent, 0x0001); ::GetProcessAffinityMask(hCurrent, &pamask, &samask); DWORD dwStart = ::timeGetTime(); _result1 = 0; for (int multi = 0; multi < _multi; multi++) { for (DWORD i = 0; i < 100000/4; i++) { _result1 += i; } } DWORD dwEnd = ::timeGetTime(); time1 = dwEnd - dwStart; ::_endthread(); return 0; } 開発環境は WindowsXP SP3 VisualStudio6.0 ATL/WTLです。
- 締切済み
- C・C++・C#
- Win32APIでのスレッド処理
こんにちは。 質問ですが、自分の環境はWindowsXP SP3 VisualStudio.NET2005 でのC++でのプログラミングです。 まず、スレッド作成をするために、_beginthreadexを用いているのですが、このやり方で、5,6個のスレッドを作成すると処理が逆に重くなってしまいました。 このスレッドは排他制御をしていないものです。 以下にソースの一部を載せます。 ///////////////////////// // スレッド作成 BOOL TestFunc::ThreadRegist(void) { UINT thID = 0; if((hThread = (HANDLE)_beginthreadex(NULL, 0, &TestFunc::tRunLauncher, this, 0, &thID)) == 0) { return FALSE; } return TRUE; } ///////////////////////// // スレッド void TestFunc::ThreadRun(void) { ras.Sprite(ene.d, ene.m, ene.s);//処理の重い画像処理 thflag = true; _endthreadex(0); } // これがクラス class TestFunc : public CTEST01 { bool rasf; bool thflag; WORD set; EffectRaster ras; double RX, RY; HANDLE hThread; static UINT WINAPI tRunLauncher(void* vp) { reinterpret_cast<TestFunc*>(vp)->ThreadRun(); return 0; } void ThreadRun(); BOOL ThreadRegist(); public: TestFunc(double x, double y, WORD type); }; このオブジェクトを多くて5~6個作っています。 上記の場所をスレッドにしない場合、逆に処理が軽くなるんです。 スレッドが5から6個でも処理が重ければ影響が出るのでしょうか? しかしそれでもスレッドにしない場合より重くなる理由が分からないでいます。 詳しい方がいらっしゃいましたらどうぞよろしくお願い致します。 m( )m
- ベストアンサー
- C・C++・C#
- スレッドの廃棄について
ウインドウ上のボタンを押すとあるスレッドがスタートするような プログラムがあるとします。 ボタンのクリックイベントプロシージャ内で 以下のように書いてスレッドをスタートさせることにしたのですが、 Sub MainWnd_CommandButton1_Click() 'スレッドのスタート hThread1=CreateThread(ByVal 0,0,AddressOf(MainOperation),0,0,VarPtr(thread1_ID)) End Sub このままではボタンがクリックされるたびに次々新しくスレッドが 生成されてしまい収拾がつかなくなるのでは?と思います。 基本的に一つのスレッドのみを存在させたいので、 CreateThreadの直前に「CloseHandle(hThread1)」と書こうかとも 思ったのですが、仮にスレッドが存在して無い場合、その場合は 無効なハンドルをクローズすることになりそうで何だか不都合が ありそうです。 スレッドの存在を調べて、あれば安全に廃棄して新しいものをスタート させる、といったことはどのように実装するべきでしょうか? ActiveBasicを使っていますが、教えて頂く際には CやVBでも構いません。
- ベストアンサー
- その他(プログラミング・開発)
- 別スレッドからメインスレッドのテキストボックスに文字を表示させたい
Visual C++ 2005 Express Editionを使用している初心者です。 タイトルの方法がどうしてもわからないので教えてください。 うまく説明できないので聞きたいところのコードを載せます。 //SAMPLE.cpp #include "stdafx.h" #include "Form1.h" using namespace SAMPLE; int main(array<System::String ^> ^args) { Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); Application::Run(gcnew Form1()); } //Form1.h #include <process.h> #include <vcclr.h> namespace SAMPLE { unsigned __stdcall counter(void *arg); int thread_id1; unsigned dummy; using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; public ref class Form1 : public System::Windows::Forms::Form { public:Form1(void) { InitializeComponent(); //別スレッド起動 thread_id1=_beginthreadex(NULL,0,counter,(void *)1,0,&dummy); } private: System::Windows::Forms::TextBox^ textBox1; private: System::ComponentModel::Container ^components; void InitializeComponent(void) { this->textBox1 = (gcnew System::Windows::Forms::TextBox()); //省略(コンポーネント初期化) } private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { } }; unsigned __stdcall counter(void *arg){ //別スレッド //ここで文字列を記述して上のtextBox1に表示したい return 0; } } 初歩的なことかもしれませんが、 よろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
ありがとうございました!