Solve.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <tchar.h>
  5. int counter = 0;
  6. //функция для вывода сообщения
  7. void ShowMessage() {
  8. char message[50];
  9. sprintf(message, "Значение: %d", counter);
  10. MessageBoxA(NULL, message, "Значение counter обновлено", MB_OK | MB_ICONINFORMATION);
  11. counter++;
  12. }
  13. //потоковая функция для фонового процесса
  14. DWORD WINAPI BackgroundThread(LPVOID lpParam) {
  15. while (1) {
  16. ShowMessage();
  17. Sleep(5000); //Задержка 5 секунд
  18. }
  19. return 0;
  20. }
  21. //Точка входа
  22. int WINAPI WinMain(HINSTANCE hlnstance, //дескриптор, присваиваемый запущенному приложению
  23. HINSTANCE hPrevInstance, //для совместимости с winl6. В win32 не используется
  24. LPSTR lpCmdLine, //указатель на командную строку, если приложение так запущено
  25. int nCmdShow) { //значение, которое может быть передано в функцию Show Window()
  26. // Создаем новый поток для уведомлений
  27. HANDLE hThread = CreateThread(
  28. NULL, // Атрибуты безопасности
  29. 0, // Размер стека по умолчанию
  30. BackgroundThread, // Функция потока
  31. NULL, // Параметр потока
  32. 0, // Флаги создания
  33. NULL); // ID потока
  34. if (hThread == NULL)
  35. {
  36. // Обработка ошибок создания потока
  37. //printf("Failed to create thread. Error: %ld\n", GetLastError());
  38. MessageBoxA(NULL, "Error creating thread", "Error", MB_OK | MB_ICONINFORMATION);
  39. return -1;
  40. }
  41. MSG msg;
  42. while (GetMessage(&msg, NULL, 0, 0)) {
  43. TranslateMessage(&msg);
  44. DispatchMessageW(&msg);
  45. }
  46. // Закрываем дескриптор потока, чтобы избежать утечек
  47. CloseHandle(hThread);
  48. // Основной поток завершает работу
  49. return 0;
  50. }