2016-09-16 20 views
-1

createthread()の後にスレッドを閉じてメモリを解放したいと考えています。私は返信createthread()のコールバックとclosehandle()でこれを行いました。いくつかの人々は、これはメモリを解放することはできません明らかにした。私はそれをテストしています、これまではとても良いです。それは大丈夫ですか?createthread()はどのようにメモリを解放するのですか?

私はフラグを取る:これを行うためにendThread、あまりにも多くのフラグがある場合は、醜く見える、それをより良くする方法?

typedef void(*pfunc)(char*); 
HANDLE H_thread=NULL; 
int endThread = 0;//0:thread not start;1:end thread order;2:thread started 
void mycall(char*s){ 
    cout << "callback" << endl; 
    cout << s << endl; 
} 
static DWORD WINAPI myfunc(LPVOID lp) 
{ 
    while (1) 
    { 
     ((pfunc)lp)("2222"); 
     cout << "thread..........." << endl; 
     Sleep(10); 
     if (1==endThread) 
     { 
      endThread = 0; 
      return 0; 
     } 
    } 
} 
void thread_callback(pfunc call){ 
    if (0==endThread) 
    { 
     H_thread = CreateThread(NULL, 0, myfunc, call, 0, NULL); 
     endThread = 2; 
     call("1111"); 
    } 
} 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    while (true) 
    { 
     thread_callback(mycall); 
     endThread = 1; 
     //wait for thread end. 
     while (endThread != 0){ 
      Sleep(1); 
     } 
     CloseHandle(H_thread); 
     H_thread = NULL; 
    } 
    while(1); 
    return 0; 
} 
+0

あなたはどのメモリを解放しようとしていますか?私はグローバル変数 'endThread'を間違って使っていますが、解放する必要のあるメモリ割り当てはありません。 –

+0

[コードレビュー](http://codereview.stackexchange.com/)を求めているようですね。 – Alisson

+0

私はendThread @ Alissonを置き換えるものを手に入れたい。endThread @ Harry Johnston – asdf

答えて

1

スレッドを何度も作成して破壊しています。スレッドが完了したかどうかはチェックしません。それがあなたの目標であることはありえません。スレッドが完了したことを確認するには、WaitForSingleObjectまたはWaitForMultipleObjectsを使用してください。ウィンドウプログラム(コンソールではない)では、スレッドからGUIスレッドまでSendMessageを使用して、スレッドが完了したことを示すことができます。

次の例を試してください。 while(1);の代わりにsystem("pause");を使用することもできますが、VS IDEからデバッグモードでプログラムを実行している場合にのみ必要です。参照してくださいデータは、あなたがそれをやってみたい場所や方法に応じて、共有されている場合はトリッキー得ることができ、データを削除するこのMSDN example

#include <iostream> 
#include <string> 
#include <windows.h> 

struct T_data { 
    std::wstring text; 
}; 

DWORD WINAPI thread_function(void *ptr) { 
    T_data* data = (T_data*)ptr; 
    MessageBoxW(GetConsoleWindow(), data->text.c_str(), 0, 0); 
    return 0; 
} 

int main() { 
    T_data *data = new T_data; 
    data->text = L"hello world"; 
    DWORD threadId; 
    HANDLE handle = CreateThread(NULL, 0, thread_function, data, 0, &threadId); 

    if (handle) { 
     printf("thread started\n"); 
     while (WaitForSingleObject(handle, 100)) 
      printf("."); 
     printf("\nthread finished\n"); 
     CloseHandle(handle); 
    } 

    delete data; 
    system("pause"); 
    return 0; 
} 

。呼び出しスレッドは、受信スレッドが処理を終了する前にデータを削除することがあります。質問にそのような共有データが表示されていないので、私はそれを残しておきます。

+0

まず、詳細な回答をいただき、ありがとうございます。実際には、スレッドが 'endThread = 0; return 0;'でスレッドが実行されたことを確認するフラグがあり、_tmain()で 'endThread = 0'を実行できる場所は1つだけです。 endThread!= 0) '、それから' CloseHandle(H_thread) '。なぜあなたはそれがうまくいくとは思わないのですか?私は理解できません。 – asdf

+0

あなたは 'while(endThread!= 0);を使用しています;これはCPUを乗っ取って、スレッドの目的を破ります。以前気付かなかったそれはそれを悪化させる。タスクマネージャを実行し、コンソールプログラムのCPU /リソース使用状況を見て、何が起きているかを確認します。 –

+0

はい、あなたは正しいです、それはCPUをハイジャックします。私はそれを気づいていません.thanks.ifは 'while'の' Sleep() 'ですか? – asdf