|
проблемы с WMI
#38775421
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
|
|
|
|
vadipokНельзя его убирать, по задумке каждую минуту будет выполнятся сканирование всех компов.
Как я это по другому реализую как не циклы?
Через синхронизацию потоков.
Изучай
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99.
#include <stdio.h>
#include <process.h>
#include <windows.h>
#include <vector>
bool stop_all = false;
typedef struct
{
char ip[20];
HANDLE work;
HANDLE free;
} arg_t;
unsigned __stdcall thread( void* pArguments )
{
// Инициализация потока
srand(GetTickCount());
Sleep(rand() % 100); // эмуляция работы
arg_t arg;
memcpy(&arg, pArguments, sizeof(arg));
printf("%d: Init thread %s\n", GetTickCount(), arg.ip);
SetEvent(arg.free);
// Выполнение расчетов
while(WaitForSingleObject(arg.work, INFINITE) == WAIT_OBJECT_0 && !stop_all) {
// Запрос данных
Sleep(rand() % 1000); // эмуляция работы
printf("%d: Query %s\n", GetTickCount(), arg.ip);
// Запрос окончен
SetEvent(arg.free);
}
// Завершение потока
Sleep(rand() % 100); // эмуляция работы
printf("%d: End thread %s\n", GetTickCount(), arg.ip);
_endthreadex(0);
return 0;
}
int main( void )
{
// Создание потоков с ожиданием их инициализации
std::vector<HANDLE> threads;
std::vector<HANDLE> th_work;
std::vector<HANDLE> th_free;
for(int i = 0; i < 4; i++)
{
arg_t arg; // параметры запуска потока
sprintf_s(arg.ip, sizeof(arg.ip), "192.168.0.%d", i);
arg.work = CreateEvent(NULL, false, false, NULL);
arg.free = CreateEvent(NULL, false, false, NULL);
HANDLE th = (HANDLE) _beginthreadex(NULL, 0, &thread, (void *) &arg, 0, NULL);
if(th == NULL) {
printf("Error create thread %d\n", i);
CloseHandle(th);
CloseHandle(arg.work);
CloseHandle(arg.free);
} else {
threads.push_back(th);
if(WaitForSingleObject(arg.free, 1000) == WAIT_TIMEOUT) { // Ждем инициализацию потока 1000 мс.
printf("Error init thread %d\n", i);
CloseHandle(arg.free);
CloseHandle(arg.work);
} else {
th_work.push_back(arg.work);
th_free.push_back(arg.free);
}
}
}
// Выполнение полезной работы потоками
for(int n = 0; n < 3; n++) { // запускаем все 3 раза
Sleep(1000 - GetTickCount() % 1000); // ждем начало секунды
printf("%d: START\n", GetTickCount());
for(int i = 0; i < th_work.size(); i++) {
SetEvent(th_work[i]);
}
int res = WaitForMultipleObjects(th_free.size(), &th_free[0], true, INFINITE);
printf("%d: END\n", GetTickCount());
}
// завершение потоков
stop_all = true;
for(int i = 0; i < th_work.size(); i++) {
SetEvent(th_work[i]);
}
WaitForMultipleObjects(threads.size(), &threads[0], true, INFINITE);
// Прибираем за собой
for(int i = 0; i < th_work.size(); i++) {
CloseHandle(th_work[i]);
}
th_work.clear();
for(int i = 0; i < th_free.size(); i++) {
CloseHandle(th_free[i]);
}
th_free.clear();
for(int i = 0; i < threads.size(); i++) {
CloseHandle(threads[i]);
}
threads.clear();
system("pause");
}
|
|
|