Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблемы с WMI / 25 сообщений из 28, страница 1 из 2
10.10.2014, 13:49
    #38773115
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Добрый день, коллеги!
Опять ошибка, теперь в многопоточности.
Вроде вчера все отладил и сегодня опять валится, см. Рисунок.

Кроме этой ошибки назовите если вам не трудно, где могут возникнуть проблемы.
На самом деле функция getDataCPU намного больше, вы там видите как снимаются данные 2 раза. Это минимум для расчета процента загрузки процессора.


Код: plaintext
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.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
int initializeCOM()
{
    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------

	hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
    if (FAILED(hres))
    {
        cout << "Failed to initialize COM library. Error code = 0x" << hex << hres << endl;
        return 1;                  // Program has failed.
    }

    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------

    hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IDENTIFY,    // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );

    if (FAILED(hres))
    {
        cout << "Failed to initialize security. Error code = 0x" << hex << hres << endl;
        //CoUninitialize();
        return 1;                    // Program has failed.
    }

	return 0;
}


unsigned __stdcall getDataCPU( void* pArguments )
{
	int step = (int) pArguments;
	IPADDRESS ipAddress = ipAddress_vec[step];
	//cout << ipAddress.ipAddress  <<endl;

	IWbemLocator *pLoc = NULL;
	IWbemServices *pSvc = NULL;

    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------

    //pLoc = NULL;

    hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres))
    {
        cout << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << endl;
        CoUninitialize();
        return 1;                 // Program has failed.
    }

	// Connect to the remote root\cimv2 namespace
    // and obtain pointer pSvc to make IWbemServices calls.
	char computerName[50];
	char* var1 = "\\\\";
	char* var2 = "\\root\\cimv2";
	sprintf(computerName, "%s%s%s", var1, ipAddress.ipAddress, var2);
   
    hres = pLoc->ConnectServer(
		_bstr_t(computerName),
        NULL,                              // User name
		NULL,                              // User password
        NULL,                              // Locale             
        NULL,                              // Security flags
		NULL,                              // Authority
        NULL,                              // Context object 
        &pSvc                              // IWbemServices proxy
        );

    if (FAILED(hres))
    {
		//cout << "Not connect to remote computer:" << ipAddress.ipAddress << endl;
        return 1;                // Program has failed.
    }

	//cout << "Connect: " << ipAddress.ipAddress << endl;

    // Step 6: --------------------------------------------------
    // Set security levels on a WMI connection ------------------

    hres = CoSetProxyBlanket(
       pSvc,                           // Indicates the proxy to set
       RPC_C_AUTHN_DEFAULT,            // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_DEFAULT,            // RPC_C_AUTHZ_xxx
       COLE_DEFAULT_PRINCIPAL,         // Server principal name 
       RPC_C_AUTHN_LEVEL_PKT_PRIVACY,  // RPC_C_AUTHN_LEVEL_xxx 
       RPC_C_IMP_LEVEL_IMPERSONATE,    // RPC_C_IMP_LEVEL_xxx
       NULL,                           // client identity
       EOAC_NONE                       // proxy capabilities 
    );

    if (FAILED(hres))
    {
        return 1;               // Program has failed.
    }

	CPU_MEMORY cpu_memory;
	cpu_memory.employeeID = ipAddress.employeeID;



	//++++++++++++++++++++++++++++
	// Расчет процента загрузки ЦП.

	long long N1, N2, D1, D2;
	long double yDivision = 0;
	long long cpu = 0;
	long long time = 0;

    // Step 7: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
		//bstr_t("Select * from Win32_PerfFormattedData_Counters_ProcessorInformation where Name = '_Total'"),
		bstr_t("Select * from Win32_PerfRawData_PerfOS_Processor where Name='_Total'"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);
    
    if (FAILED(hres))
    {
        cout << "Query for operating system name failed." << " Error code = 0x" << hex << hres << endl;
        return 1;               // Program has failed.
    }


    // Step 8: -------------------------------------------------
    // Secure the enumerator proxy
    hres = CoSetProxyBlanket(
        pEnumerator,                    // Indicates the proxy to set
        RPC_C_AUTHN_DEFAULT,            // RPC_C_AUTHN_xxx
        RPC_C_AUTHZ_DEFAULT,            // RPC_C_AUTHZ_xxx
        COLE_DEFAULT_PRINCIPAL,         // Server principal name 
        RPC_C_AUTHN_LEVEL_PKT_PRIVACY,  // RPC_C_AUTHN_LEVEL_xxx 
        RPC_C_IMP_LEVEL_IMPERSONATE,    // RPC_C_IMP_LEVEL_xxx
        NULL,                           // client identity
        EOAC_NONE                       // proxy capabilities 
        );

    if (FAILED(hres))
    {
        cout << "Could not set proxy blanket on enumerator. Error code = 0x" << hex << hres << endl;
		pEnumerator->Release();
        return 1;               // Program has failed.
    }

    // Step 9: -------------------------------------------------
    // Get the data from the query in step 7 -------------------
 
    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0;

    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
		/*
		+++++++++++++++++++++++++++++
		ОШИБКА ТУТ
		+++++++++++++++++++++++++++++
		*/

        if(0 == uReturn)
        {
            break;
        }

        VARIANT vtProp;
		VARIANT vtProp2;

		hr = pclsObj->Get(L"PercentProcessorTime", 0, &vtProp, 0, 0);
		hr = pclsObj->Get(L"TimeStamp_Sys100NS", 0, &vtProp2, 0, 0);

		N1 = (long long) _wtoi64(vtProp.bstrVal);
		D1 = (long long) _wtoi64(vtProp2.bstrVal);
		
		VariantClear(&vtProp);
		VariantClear(&vtProp2);

        pclsObj->Release();
        pclsObj = NULL;
    }

    // Cleanup
    pEnumerator->Release();
	if( pclsObj )
    {
        pclsObj->Release();
    }

	//++++++++++++++++++++++++++++++++
	Sleep(2000);
	//++++++++++++++++++++++++++++++++

    // Step 7: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----
    hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
		bstr_t("Select * from Win32_PerfRawData_PerfOS_Processor where Name='_Total'"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);
    
    if (FAILED(hres))
    {
        cout << "Query for operating system name failed." << " Error code = 0x" << hex << hres << endl;
        return 1;               // Program has failed.
    }


    // Step 8: -------------------------------------------------
    // Secure the enumerator proxy
    hres = CoSetProxyBlanket(
        pEnumerator,                    // Indicates the proxy to set
        RPC_C_AUTHN_DEFAULT,            // RPC_C_AUTHN_xxx
        RPC_C_AUTHZ_DEFAULT,            // RPC_C_AUTHZ_xxx
        COLE_DEFAULT_PRINCIPAL,         // Server principal name 
        RPC_C_AUTHN_LEVEL_PKT_PRIVACY,  // RPC_C_AUTHN_LEVEL_xxx 
        RPC_C_IMP_LEVEL_IMPERSONATE,    // RPC_C_IMP_LEVEL_xxx
        NULL,                           // client identity
        EOAC_NONE                       // proxy capabilities 
        );

    if (FAILED(hres))
    {
        cout << "Could not set proxy blanket on enumerator. Error code = 0x" << hex << hres << endl;
        return 1;               // Program has failed.
    }

    // Step 9: -------------------------------------------------
    // Get the data from the query in step 7 -------------------

    uReturn = 0;

    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

        if(0 == uReturn)
        {
            break;
        }

        VARIANT vtProp;
		VARIANT vtProp2;

		hr = pclsObj->Get(L"PercentProcessorTime", 0, &vtProp, 0, 0);
		hr = pclsObj->Get(L"TimeStamp_Sys100NS", 0, &vtProp2, 0, 0);

		N2 = (long long) _wtoi64(vtProp.bstrVal);
		D2 = (long long) _wtoi64(vtProp2.bstrVal);
		
		VariantClear(&vtProp);
		VariantClear(&vtProp2);

		cpu = (long long)N2 - (long long)N1;
		time = (long long)D2 - (long long)D1;

		yDivision = (long double)cpu/(long double)time;

		long double percentUsingProcessor = 0;
		percentUsingProcessor =  (1 - yDivision) * 100;
		
		cpu_memory.percentCPU = (int) ceil(percentUsingProcessor);

        pclsObj->Release();
        pclsObj = NULL;
    }

    // Cleanup
    pEnumerator->Release();
	if( pclsObj )
    {
        pclsObj->Release();
    }


	//+++++++++++++++++++++++++++++++++++


	pSvc->Release();
	pLoc->Release();
	//CoUninitialize();

    return 0;   // Program successfully completed.
}




Этот фрагмент кода запускается много раз. 2 раза он выполняется нормально и ломается на 3-м шаге в указанном месте.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
		cout << "start threads" << endl;

		b = initializeCOM();
		
		for (d=0;d<(int) ipAddress_vec.size();d++) {
			unsigned threadId;
			threads[d] = (HANDLE)_beginthreadex(&sa, 8192, &getDataCPU, (void *) d, 0, &threadId);
		}

		//WaitForMultipleObjects(ipAddress_vec.size(), threads, true, INFINITE);
		d=0;
		for (d=0;d<(int) ipAddress_vec.size();d++) {
			WaitForSingleObject( threads[d], 60000 );
			CloseHandle(threads[d]);
		}

		CoUninitialize();

		cout << "Request complited for " << ipAddress_vec.size() << " computers" << endl;

		cout << "stop threads" << endl;
...
Рейтинг: 0 / 0
10.10.2014, 13:50
    #38773117
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Сори, не успел скрин ошибки выложить.
...
Рейтинг: 0 / 0
10.10.2014, 14:06
    #38773145
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Код: plaintext
1.
2.
3.
4.
unsigned __stdcall getDataCPU( void* pArguments )
{
...
    hres = CoCreateInstance(...]


hres глобальная переменная? Если так, то ее все потоки одновременно используют.

Чтобы она была глобальной только на уровне потока надо так объявлять
Код: plaintext
1.
__declspec( thread ) HRESULT hres = 0;


тогда каждый поток свой hres будет использовать.

С другими глобальными точно так же.

Посмотрел код, непонятно зачем hres глобальная. Оно точно надо?
...
Рейтинг: 0 / 0
10.10.2014, 14:21
    #38773166
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Dima T
Код: plaintext
1.
2.
3.
4.
unsigned __stdcall getDataCPU( void* pArguments )
{
...
    hres = CoCreateInstance(...]


hres глобальная переменная? Если так, то ее все потоки одновременно используют.

Чтобы она была глобальной только на уровне потока надо так объявлять
Код: plaintext
1.
__declspec( thread ) HRESULT hres = 0;


тогда каждый поток свой hres будет использовать.

С другими глобальными точно так же.

Посмотрел код, непонятно зачем hres глобальная. Оно точно надо?

Спасибо!

Да, глобальная.
b = initializeCOM();
Там используется hres.
Инициализация СОМ происходит один для всех потоков.

Из других глобальных переменных есть только cpu_memory_vec(в примере его нет).
Этот вектор заполняется всеми потоками, а потом происходит заливка в СУБД.

Скрин ошибки привожу, сейчас свалилась только на 6-м шаге поэтому так долго.
...
Рейтинг: 0 / 0
10.10.2014, 14:25
    #38773171
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Текст ошибки.
Первый этап обработки исключения в "0x77149c17" в "connectOracle.exe": 0xC0000005: Нарушение прав доступа при чтении "0xdcbfd870".
Поток 'Поток Win32' (0x2680) завершился с кодом 1 (0x1).

STATUS_STACK_BUFFER_OVERRUN encountered
...
Рейтинг: 0 / 0
10.10.2014, 14:41
    #38773199
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
CoInitializeEx() надо в каждом потоке вызывать.
http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms695279(v=vs.85).aspx Remarks

CoInitializeEx must be called at least once, and is usually called only once, for each thread that uses the COM library.

Вобщем переделывай чтобы в каждом потоке вызывалось твоя initializeCOM()
...
Рейтинг: 0 / 0
10.10.2014, 14:43
    #38773202
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Dima TCoInitializeEx() надо в каждом потоке вызывать.
http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms695279(v=vs.85).aspx Remarks

CoInitializeEx must be called at least once, and is usually called only once, for each thread that uses the COM library.

Вобщем переделывай чтобы в каждом потоке вызывалось твоя initializeCOM()

Пробовал уже вчера, нельзя так.
...
Рейтинг: 0 / 0
10.10.2014, 14:49
    #38773213
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Dima T,

Стоп! Беру свои слова обратно.
Ваши слова хоть с опозданием, но подействовали отрезвляюще. ))

Код: plaintext
1.
hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 



MULTITHREADED о чем то говорит.
...
Рейтинг: 0 / 0
10.10.2014, 14:54
    #38773224
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
vadipokПробовал уже вчера, нельзя так.
Если я хэлп правильно понимаю - можно и нужно.

Пробовал с глобальной hres?
...
Рейтинг: 0 / 0
10.10.2014, 15:04
    #38773249
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Dima TvadipokПробовал уже вчера, нельзя так.
Если я хэлп правильно понимаю - можно и нужно.

Пробовал с глобальной hres?

Вот так пробовал, думаю по началу понятно будет, просто закаментил.
Код: plaintext
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.
unsigned __stdcall getDataCPU( void* pArguments )
{
    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------
	/*HRESULT hres;

	hres =  CoInitializeEx(0, COINIT_APARTMENTTHREADED); 
    if (FAILED(hres))
    {
        cout << "Failed to initialize COM library. Error code = 0x" << hex << hres << endl;
        return 1;                  // Program has failed.
    }

    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------

    hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IDENTIFY,    // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );

    if (FAILED(hres))
    {
        cout << "Failed to initialize security. Error code = 0x" << hex << hres << endl;
        //CoUninitialize();
        return 1;                    // Program has failed.
    }
	*/

	int step = (int) pArguments;
	IPADDRESS ipAddress = ipAddress_vec[step];
	//cout << ipAddress.ipAddress  <<endl;

	IWbemLocator *pLoc = NULL;
	IWbemServices *pSvc = NULL;

    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------

    //pLoc = NULL;

    hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres))
    {
        cout << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << endl;
        //CoUninitialize();
        return 1;                 // Program has failed.
    }
...
Рейтинг: 0 / 0
10.10.2014, 15:14
    #38773284
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Код: plaintext
1.
hres =  CoInitializeEx(0, COINIT_APARTMENTTHREADED); 


Почему COINIT_APARTMENTTHREADED ? Попробуй COINIT_MULTITHREADED
http://msdn.microsoft.com/en-us/library/windows/desktop/ff485844(v=vs.85).aspx You must set exactly one of these flags. Generally, a thread that creates a window should use the COINIT_APARTMENTTHREADED flag, and other threads should use COINIT_MULTITHREADED.

PS Гугл переводчик повеселил )) https://translate.google.ru/#en/ru/Apartment threaded.
...
Рейтинг: 0 / 0
10.10.2014, 15:20
    #38773298
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Dima T
Код: plaintext
1.
hres =  CoInitializeEx(0, COINIT_APARTMENTTHREADED); 


Почему COINIT_APARTMENTTHREADED ? Попробуй COINIT_MULTITHREADED
http://msdn.microsoft.com/en-us/library/windows/desktop/ff485844(v=vs.85).aspx You must set exactly one of these flags. Generally, a thread that creates a window should use the COINIT_APARTMENTTHREADED flag, and other threads should use COINIT_MULTITHREADED.

PS Гугл переводчик повеселил )) https://translate.google.ru/#en/ru/Apartment threaded.

))

Это я уже экспериментировал, на самом деле там было COINIT_MULTITHREADED.
...
Рейтинг: 0 / 0
10.10.2014, 16:22
    #38773443
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Вопрос актуальный.
...
Рейтинг: 0 / 0
13.10.2014, 13:35
    #38775078
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Даже так ошибка

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
		try
		{
			hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
		}
		catch (...)
		{
			return 1;
		}
...
Рейтинг: 0 / 0
13.10.2014, 13:41
    #38775088
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Читаю свой текст и мне кажется, что я не правильно объяснил суть проблемы.

Проблема в том, что в первый раз код написанный с низу выполняется на ура, т. е. 1-й запуск Хорошо работает для всех ip адресов(их порядка 300).
Потом на любом шаге, начиная с трех может вылезти ошибка.

Код: plaintext
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.
While (....) 
{
..............
.............
		cout << "start threads" << endl;

		b = initializeCOM();
		
		for (d=0;d<(int) ipAddress_vec.size();d++) {
			unsigned threadId;
			threads[d] = (HANDLE)_beginthreadex(&sa, 8192, &getDataCPU, (void *) d, 0, &threadId);
		}

		//WaitForMultipleObjects(ipAddress_vec.size(), threads, true, INFINITE);
		d=0;
		for (d=0;d<(int) ipAddress_vec.size();d++) {
			WaitForSingleObject( threads[d], 60000 );
			CloseHandle(threads[d]);
		}

		CoUninitialize();

		cout << "Request complited for " << ipAddress_vec.size() << " computers" << endl;

		cout << "stop threads" << endl;


.................
}
...
Рейтинг: 0 / 0
13.10.2014, 13:47
    #38775096
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Очень нужна помощь, коллеги.

Сейчас пробовал следующее, ошибка все равно вылезает.
Код: plaintext
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.
HRESULT hres[120];
int hresStep = 0;

int initializeCOM()
{
    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------

	hres[hresStep] =  CoInitializeEx(0, COINIT_MULTITHREADED); 
	//hres =  CoInitialize(0);
	//COINIT_MULTITHREADED
	//COINIT_SPEED_OVER_MEMORY
    if (FAILED(hres[hresStep]))
    {
        cout << "Failed to initialize COM library. Error code = 0x" << hex << hres[hresStep] << endl;
        return 1;                  // Program has failed.
    }

..............

	return 0;
}

unsigned __stdcall getDataCPU( void* pArguments )
{
...
}

int main(int argc,char* argv[])
  {
.....
while (t<120)
{
.....
		b = initializeCOM();
		
		for (d=0;d<(int) ipAddress_vec.size();d++) {
			//unsigned threadId;
			//threads[d] = (HANDLE)_beginthreadex(&sa, 4096, &getDataCPU, (void *) d, 0, NULL);
			threads[d] = (HANDLE)_beginthreadex(NULL, 0, &getDataCPU, (void *) d, 0, NULL);
		}

		//WaitForMultipleObjects(ipAddress_vec.size(), threads, true, INFINITE);
		d=0;
		for (d=0;d<(int) ipAddress_vec.size();d++) {
			WaitForSingleObject( threads[d], 30000 );
			CloseHandle(threads[d]);
		}

......
CoUninitialize();
hresStep++;
}
....
}
...
Рейтинг: 0 / 0
13.10.2014, 14:04
    #38775113
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
vadipokЧитаю свой текст и мне кажется, что я не правильно объяснил суть проблемы.

Проблема в том, что в первый раз код написанный с низу выполняется на ура, т. е. 1-й запуск Хорошо работает для всех ip адресов(их порядка 300).
Потом на любом шаге, начиная с трех может вылезти ошибка...
Ты в очередной раз доказал что телепатов тут нет

Для начала попробуй вынеси за while() инициализацию COMа
Код: plaintext
1.
2.
3.
4.
5.
6.
b = initializeCOM();
While (....) 
{
...
}
CoUninitialize();
...
Рейтинг: 0 / 0
13.10.2014, 14:10
    #38775117
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Да я просто не знаю за что зацепится.
Хотел закончить все в эту пятницу, да видно не судьба. ))
Когда человек тонет, то хватается за любую щепку.
...
Рейтинг: 0 / 0
13.10.2014, 14:18
    #38775126
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Ты бы сделал пример своего кода, так чтобы можно было задать 2-3 IP и запустить.
Не факт что проблема именно в тех кусках которые ты сюда выкладываешь.

PS Только лишнего не надо. Консольная прога, в main() запуск потоков, в потоках опрос и printf() результата.
PPS только сначала убедись что пример у тебя глючит :)
...
Рейтинг: 0 / 0
13.10.2014, 14:56
    #38775200
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Вот эта конструкция нездоровая
vadipok
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
.....
while (t<120)
{
.....
	threads[d] = (HANDLE)_beginthreadex(NULL, 0, &getDataCPU, (void *) d, 0, NULL);
.....
	WaitForSingleObject( threads[d], 30000 );
......
}


Убери while (t<120) в поток, пусть он там крутится в каждом потоке, если надо - синхронизируй потоки. А так получается куча накладных расходов: сначала поток создай, внутри объект получи, один раз им попользовался, все закрыл и все сначала. Если к объекту надо много раз обратиться - держи его до тех пор пока он нужен.

Делай рабочий пример, подопиливаем.
...
Рейтинг: 0 / 0
13.10.2014, 15:17
    #38775228
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Код: plaintext
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.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
int main(int argc,char* argv[])
  {
  int b = 0; 
  //b = initializeCOM();
  try
    {
...................
	b = initializeCOM();
	while (i < 120)
	{
		rs = stmt->executeQuery();

		// вычесление процессов будет один раз в 15 шагов.
		param = (double) step_circle/ (double) 15;
		fractpart = modf (param , &intpart);
		if (fractpart == 0) {
			flag_process = 1;
		} else {
			flag_process = 0;
		}

		step_circle++;
		while (rs->next())
			  {
			  ipAddressStrucIn.employeeID = rs->getInt (1);
			  t1  = rs->getInt (2);
			  t2  = rs->getInt (3);
			  t3  = rs->getInt (4);
			  t4  = rs->getInt (5);
			  ss << t1 << "." << t2 << "." << t3 << "." << t4;
			  t = ss.str();
			  ipAddressStrucIn.ipAddress = strdup(t.c_str());

			  ipAddress_vec.push_back(ipAddressStrucIn);

			  //clear
			  ss.str(std::string());
			  ss.clear();
			  t.clear();
			  }
		
		HANDLE threads[1000];
		SECURITY_ATTRIBUTES  sa = {sizeof(SECURITY_ATTRIBUTES), 0, TRUE};


		cout << "start threads for: " << ipAddress_vec.size() << endl;

		//b = initializeCOM();
		
		for (d=0;d<(int) ipAddress_vec.size();d++) {
			//unsigned threadId;
			//threads[d] = (HANDLE)_beginthreadex(&sa, 4096, &getDataCPU, (void *) d, 0, NULL);
			threads[d] = (HANDLE)_beginthreadex(NULL, 0, &getDataCPU, (void *) d, 0, NULL);
		}

		//WaitForMultipleObjects(ipAddress_vec.size(), threads, true, INFINITE);
		d=0;
		for (d=0;d<(int) ipAddress_vec.size();d++) {
			WaitForSingleObject( threads[d], 30000 );
			CloseHandle(threads[d]);
		}
		

		
		//hresStep++;

		cout << "Request complited for " << ipAddress_vec.size() << " computers" << endl;

		cout << "stop threads" << endl;

		//+++++++Insert Oracle
		cout << "Insert Oracle" << endl;
		int c;
		for (c=0;c<cpu_memory_vec.size();c++) {
			cpu_memory = cpu_memory_vec[c];
			ss << insert << cpu_memory.employeeID << ", " << cpu_memory.percentCPU << ", " << cpu_memory.percentMemory << ", " << cpu_memory.freeMemory << ")";
			t = ss.str();
			insertSQL = t.c_str();
			stmt2->execute(insertSQL);
			ss.str(std::string());
			ss.clear();
			t.clear();
		}

		stmt2->execute("COMMIT");

		int h;
		if (flag_process == 1) {
			cout << "Insert Oracle Process" << endl;
			for (h=0;h<process_vec.size();h++) {
				getProcess = process_vec[h];
				ss << insertProcess << getProcess.employeeID << ", '" << getProcess.name << "', " << getProcess.memory << ", " << getProcess.proc_time << ")";
				t = ss.str();
				insertSQLProcess = t.c_str();
				//wcout << insertSQLProcess << endl;
				stmt2->execute(insertSQLProcess);
				ss.str(std::string());
				ss.clear();
				t.clear();

				double param2, fractpart2, intpart2;
				param2 = (double) h/ (double) 15;
				fractpart2 = modf (param2 , &intpart2);
				if (fractpart2 == 0) {
					stmt2->execute("COMMIT");
				}
			}
			cout << "End insert Oracle Process" << endl;
			stmt2->execute("COMMIT");
		}

		cout << "End insert Oracle" << endl;

		//hres->
		cpu_memory_vec.clear();
		process_vec.clear();
		ipAddress_vec.clear();
		//+++++++++++++++++++

		stmt->closeResultSet(rs);
		Sleep(60000); //засыпаем на 1 минуту
		i++;
	}

	CoUninitialize();

    //Освобождение ресурсов connect Oracle
    env->terminateConnection(conn);
    Environment::terminateEnvironment(env);
    }
	catch(SQLException &sqlExcp)
    {
    cerr << sqlExcp.getErrorCode() << " " << sqlExcp.getMessage() << endl;
    }

  Sleep(10000);

  // Освобождение ресурсов connect COM WMI
  //pSvc->Release();
  //pLoc->Release();
  //CoUninitialize();

  return 0;
}



Старнности какие-то, почему то вектор ipAddress_vec не очищается после ошибки.

А прежняя ошибка, тьфу-тьфу ушла. )

Модератор: vadipok, а вот вместо картинки текст вставить из консоли, да ещё оформив его соответствующим образом, нельзя было?
...
Рейтинг: 0 / 0
13.10.2014, 15:24
    #38775243
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Dima TВот эта конструкция нездоровая
vadipok
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
.....
while (t<120)
{
.....
	threads[d] = (HANDLE)_beginthreadex(NULL, 0, &getDataCPU, (void *) d, 0, NULL);
.....
	WaitForSingleObject( threads[d], 30000 );
......
}


Убери while (t<120) в поток, пусть он там крутится в каждом потоке, если надо - синхронизируй потоки. А так получается куча накладных расходов: сначала поток создай, внутри объект получи, один раз им попользовался, все закрыл и все сначала. Если к объекту надо много раз обратиться - держи его до тех пор пока он нужен.

Делай рабочий пример, подопиливаем.

Нельзя его убирать, по задумке каждую минуту будет выполнятся сканирование всех компов.
Как я это по другому реализую как не циклы?
В конце кода вы увидите
Код: plaintext
1.
2.
		Sleep(60000); //засыпаем на 1 минуту
		i++;



Пока такой простой способ, завязанный на стандартный шедуллинг Windows.
...
Рейтинг: 0 / 0
13.10.2014, 15:32
    #38775263
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
Модератору:
Извиняюсь, а как?
Это же вывод в командную строку, сейчас все перелопатил там.
Ctrl+C, Ctrl+V; Shift+Insert, Ctrl+Insert перепробывал не помогло.
...
Рейтинг: 0 / 0
13.10.2014, 16:06
    #38775334
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
vadipokИзвиняюсь, а как?в левом верхнем углу консольного окна есть иконка - это системное меню, или правый клик мышью в области окна консоли. Пункт меню "Пометить", потом пункт меню "Копировать <ВВОД>". Темнота
...
Рейтинг: 0 / 0
13.10.2014, 16:22
    #38775360
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с WMI
vadipokМодератору:
Извиняюсь, а как?
Это же вывод в командную строку, сейчас все перелопатил там.
Ctrl+C, Ctrl+V; Shift+Insert, Ctrl+Insert перепробывал не помогло.

А так и так .
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблемы с WMI / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]