/* * ReactOS winfile * * worker.c * * Copyright (C) 2002 Robert Dickenson * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef _MSC_VER #include "stdafx.h" #else #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include #include #include #include #include #include #include #include #endif #include #include #include #define ASSERT assert #include "main.h" #include "worker.h" //////////////////////////////////////////////////////////////////////////////// // Global Variables: // static HANDLE hMonitorThreadEvent = NULL; // When this event becomes signaled then we run the monitor thread void MonitorThreadProc(void *lpParameter); //////////////////////////////////////////////////////////////////////////////// // Local module support methods // LRESULT CALLBACK MoveDialogWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND hLicenseEditWnd; TCHAR strLicense[0x1000]; switch (message) { case WM_INITDIALOG: hLicenseEditWnd = GetDlgItem(hDlg, IDC_LICENSE_EDIT); LoadString(hInst, IDS_LICENSE, strLicense, 0x1000); SetWindowText(hLicenseEditWnd, strLicense); return TRUE; case WM_COMMAND: if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL)) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return 0; } void StartWorkerThread(HWND hWnd) { DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)MoveDialogWndProc); } //////////////////////////////////////////////////////////////////////////////// void MonitorThreadProc(void *lpParameter) { // ULONG OldProcessorUsage = 0; // ULONG OldProcessCount = 0; HWND hWnd = (HWND)lpParameter; // Create the event hMonitorThreadEvent = CreateEvent(NULL, TRUE, TRUE, "Winfile Monitor Event"); // If we couldn't create the event then exit the thread if (!hMonitorThreadEvent) return; while (1) { DWORD dwWaitVal; // Wait on the event dwWaitVal = WaitForSingleObject(hMonitorThreadEvent, INFINITE); // If the wait failed then the event object must have been // closed and the task manager is exiting so exit this thread if (dwWaitVal == WAIT_FAILED) { // CloseHandle(hMonitorThreadEvent); // Should we close the event object handle or not ??? // hMonitorThreadEvent = NULL; // if we do then check what happens when main thread tries to delete it also.... return; } if (dwWaitVal == WAIT_OBJECT_0) { // Reset our event ResetEvent(hMonitorThreadEvent); #if 0 TCHAR text[260]; if ((ULONG)SendMessage(hProcessPageListCtrl, LVM_GETITEMCOUNT, 0, 0) != PerfDataGetProcessCount()) SendMessage(hProcessPageListCtrl, LVM_SETITEMCOUNT, PerfDataGetProcessCount(), /*LVSICF_NOINVALIDATEALL|*/LVSICF_NOSCROLL); if (IsWindowVisible(hProcessPage)) InvalidateRect(hProcessPageListCtrl, NULL, FALSE); if (OldProcessorUsage != PerfDataGetProcessorUsage()) { OldProcessorUsage = PerfDataGetProcessorUsage(); wsprintf(text, _T("CPU Usage: %3d%%"), OldProcessorUsage); SendMessage(hStatusWnd, SB_SETTEXT, 1, (LPARAM)text); } if (OldProcessCount != PerfDataGetProcessCount()) { OldProcessCount = PerfDataGetProcessCount(); wsprintf(text, _T("Processes: %d"), OldProcessCount); SendMessage(hStatusWnd, SB_SETTEXT, 0, (LPARAM)text); } #endif } } } BOOL CreateMonitorThread(HWND hWnd) { _beginthread(MonitorThreadProc, 0, hWnd); return TRUE; } void SignalMonitorEvent(void) { SetEvent(hMonitorThreadEvent); } BOOL DestryMonitorThread(void) { CloseHandle(hMonitorThreadEvent); hMonitorThreadEvent = NULL; return TRUE; }