Manip_Threads.cpp
Upload User: dq031136
Upload Date: 2022-08-08
Package Size: 802k
Code Size: 3k
Development Platform:

C++ Builder

  1. #include <genstub.cpp>
  2. // Hot key values.
  3. #define RESUME_KEY    101
  4. #define SUSPEND_KEY   102
  5. #define TERMINATE_KEY 103
  6. DWORD WINAPI ThreadProc(HWND hWnd)
  7. {
  8.     TCHAR szBuffer[128];
  9.     wsprintf( szBuffer, "Starting Thread ID = %lX", GetCurrentThreadId() );
  10.     SetWindowText( hWnd, szBuffer );
  11.     Sleep( 5000 );
  12.     wsprintf( szBuffer, "Thread %lX finished execution", GetCurrentThreadId() );
  13.     SetWindowText( hWnd, szBuffer );
  14.     ExitThread( TRUE );
  15. }
  16. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  17. {
  18.     static  HANDLE hChild = 0;
  19.     switch (uMsg)
  20.     {
  21.             case WM_CREATE:
  22.                     RegisterHotKey(hWnd, RESUME_KEY, MOD_ALT, 'R');
  23.                     RegisterHotKey(hWnd, SUSPEND_KEY, MOD_ALT, 'S');
  24.                     RegisterHotKey(hWnd, TERMINATE_KEY, MOD_ALT, 'K');
  25.                     return DefWindowProc( hWnd, uMsg, wParam, lParam );
  26.             case WM_DESTROY:
  27.                     UnregisterHotKey(hWnd, RESUME_KEY);
  28.                     UnregisterHotKey(hWnd, SUSPEND_KEY);
  29.                     UnregisterHotKey(hWnd, TERMINATE_KEY);
  30.                     PostQuitMessage( 0 );
  31.                     break;
  32.             case WM_HOTKEY:
  33.                     {
  34.                        TCHAR szBuffer[128];
  35.                        DWORD dwExitCodeThread = STILL_ACTIVE;
  36.                        lstrcpy( szBuffer, "No Child Thread Running" );
  37.                        if (hChild)
  38.                           GetExitCodeThread(hChild, &dwExitCodeThread);
  39.                        if (dwExitCodeThread==STILL_ACTIVE)
  40.                           switch (wParam)
  41.                           {
  42.                              case SUSPEND_KEY:
  43.                                  wsprintf( szBuffer, "Suspending thread %lX", hChild );
  44.                                  SuspendThread(hChild);
  45.                                  break;
  46.                              case RESUME_KEY:
  47.                                  wsprintf( szBuffer, "Resuming thread %lX", hChild );
  48.                                  ResumeThread(hChild);
  49.                                  break;
  50.                              case TERMINATE_KEY:
  51.                                  wsprintf( szBuffer, "Terminating thread %lX", hChild );
  52.                                  TerminateThread(hChild, FALSE);
  53.                                  break;
  54.                           }
  55.                        SetWindowText( hWnd, szBuffer );
  56.                     }
  57.                     break;
  58.             case WM_COMMAND:  // Process menu items.
  59.                     switch ( LOWORD( wParam )  )
  60.                     {
  61.                         case IDM_TEST:
  62.                            {  // Start a thread. Only one thread at at time.
  63.                               DWORD dwExitCodeThread;
  64.                               DWORD dwChild;
  65.                               if (hChild)
  66.                                  GetExitCodeThread( hChild, &dwExitCodeThread );
  67.                               if (dwExitCodeThread!=STILL_ACTIVE)
  68.                                  hChild = CreateThread(NULL, 0, ThreadProc, hWnd, 0, &dwChild );
  69.                            }
  70.                            break;
  71.                         case IDM_EXIT:
  72.                               DestroyWindow( hWnd );
  73.                               break;
  74.                     }
  75.             break;
  76.             default:
  77.                  return DefWindowProc( hWnd, uMsg, wParam, lParam );
  78.     }
  79.     return NULL;
  80. }