Здравствуйте, Alex777, Вы писали:
A>как узнать она зависла или тормозит просто
Сначало надо дать четкую грань между зависла и тормозит. Думаю такой нет.
Здравствуйте, comer, Вы писали:
C>Здравствуйте, Alex777, Вы писали:
A>>как узнать она зависла или тормозит просто C>Сначало надо дать четкую грань между зависла и тормозит. Думаю такой нет.
Вот именно. Так или иначе, тебе придется делать некую оценку времени, которое может понадобиться на ее выполнение, либо вывести юзеру окошко с сообщением "Ждите ответа " и кнопочкой Cancel, чтобы он мог отменить выполнение этой функции, в случае если ему надоело ждать.
\/\/i||i
Re[8]: Как в VC++ 6.0 вырубать функцию
От:
Аноним
Дата:
05.03.03 08:52
Оценка:
Здравствуйте, Willi, Вы писали:
W>Здравствуйте, Alex777, Вы писали:
A>>Как узнать она завершилась или просто тормозит дай примерчик если есть
W>что-то вроде
W>
W>HANDLE hThread = CreateThread(...);
W> // передаем нужные парметры и уже в новом потоке
W> // вызываем эту волшебную функцию
W>DWORD dwResult = WaitForSingleObject(hThread, dwTimeout);
W>if (dwResult == WAIT_OBJECT_0)
W>{
W> // все пучком
W>}
W>else
W>{
W> // не работает, зараза
W> TerminateThread(hThread, 0);
W>}
W>
W>
Вот за WaitForSingleObject тебе большое Человеческое Спасибо хороший человек.
а Ты ERP SAP R/3 не знаешь
"Alex777" <forum@rsdn.ru> wrote in message news:207358@news.rsdn.ru... > Как узнать она завершилась или просто тормозит дай примерчик если есть
Можно просто предположыть сколько <b>максимально</b> может занять вызов функции из ДЛЛ и если по истечению этого времени поток управление не возвращает тогда убивать его нужно
switch (dwWaitResult)
{
// The thread got thread ownership.
case WAIT_OBJECT_0:
__try {
// Success
}
__finally {
// Release ownership of the thread object.
if (! CloseHandle(hThread)) {
// Deal with error.
}
break;
}
// Cannot get thread ownership due to time-out.
case WAIT_TIMEOUT:
return FALSE;
// Got ownership of the abandoned thread object.
case WAIT_ABANDONED:
return FALSE;
}
Posted via RSDN NNTP Server 1.4.5
Re[10]: Как в VC++ 6.0 вырубать функцию
От:
Аноним
Дата:
05.03.03 09:57
Оценка:
Здравствуйте, Willi, Вы писали:
W>Здравствуйте, Аноним, Вы писали:
А>>Вот за WaitForSingleObject тебе большое Человеческое Спасибо хороший человек.
W>Хм, не понял, что-то не так?
А>>а Ты ERP SAP R/3 не знаешь
W>Слышал такое слово, и даже один скриншот видел W>А при чем тут это?
W>Хм, не понял, что-то не так?
нет все так, только пока не работает, понимаешь я имитирую выполнение зависания путем создания бесконечного цикла, он оттуда не выходит по таймауту, но я разберусь.
ЧЁ докапался просто спрасил
Re[8]: Re: Re[6]: Как в VC++ 6.0 вырубать функцию
От:
Аноним
Дата:
05.03.03 11:25
Оценка:
Здравствуйте, promko, Вы писали:
P>"Alex777" <forum@rsdn.ru> wrote in message news:207358@news.rsdn.ru... >> Как узнать она завершилась или просто тормозит дай примерчик если есть
P>Можно просто предположыть сколько <b>максимально</b> может занять вызов функции из ДЛЛ и если по истечению этого времени поток управление не возвращает тогда убивать его нужно
P>hThread = CreateThread(...); // _beginthreadex P>dwWaitResult = WaitForSingleObject( P>hThread, // handle to thread P>5000L); // five-second time-out interval
P>switch (dwWaitResult) P>{ P>// The thread got thread ownership. P>case WAIT_OBJECT_0: P>__try { P>// Success P>} P>__finally { P>// Release ownership of the thread object. P>if (! CloseHandle(hThread)) { P>// Deal with error. P>} P>break; P>} P>// Cannot get thread ownership due to time-out. P>case WAIT_TIMEOUT: P>return FALSE; P>// Got ownership of the abandoned thread object. P>case WAIT_ABANDONED: P>return FALSE; P>}
P>
P>
P>
P>
А как в hThread потоке вызвать функцию
Здравствуйте, Willi, Вы писали:
W>Здравствуйте, Аноним, Вы писали:
А>>А как в hThread потоке вызвать функцию
W>Так же как и в любом другом месте программы W>
Willi помоги, что не так :
DWORD dwThreadId, dwThrdParam = 1;
HANDLE hThread;
DWORD dwResult;
int n = 0;
hThread = CreateThread(
NULL, // no security attributes
0, // use default stack size
ThreadFunc, // thread function
&dwThrdParam, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier
// Check the return value for success.
if (hThread == NULL)
MessageBox(NULL,"All Right","WHAT FUCK",MB_OK);
Здесь не вызывается ThreadFunc
// ThreadFunc((LPVOID)1);
dwResult = WaitForSingleObject(hThread, 10);
//readFunc((LPVOID)1);
// while(1)
// n = n+1;
if (dwResult == WAIT_OBJECT_0)
{
// все пучком
MessageBox(NULL,"All Right","WHAT FUCK",MB_OK);
}
else
{
// не работает, зараза //здесь вдруг вызывает ThreadFunc() и циклица
MessageBox(NULL,"Fuck you Time out","WHAT FUCK",MB_OK);
TerminateThread(hThread, 0);
}
Здравствуйте, Alex777, Вы писали:
A>Здравствуйте, Alex777, Вы писали:
A>>Как в VC++ 6.0 вырубать функцию если она не получила значение по истечению определенного времени спасибо A>up
Наверно у тебя не получица вырубить зависшую функцию. Этта очень сложно
Re[3]: Как в VC++ 6.0 вырубать функцию
От:
Аноним
Дата:
05.03.03 15:05
Оценка:
IP>Наверно у тебя не получица вырубить зависшую функцию. Этта очень сложно
У тебя наверно получилось
Re[11]: Re: Re[6]: Как в VC++ 6.0 вырубать функцию
Здравствуйте, Alex777, Вы писали:
A>Willi помоги, что не так :
Извини за прямоту, но прежде чем материться, неплохо бы сесть и почитать, что такое потоки и как с ними работать.
А еще примеры исходного кода, неплохо бы обрамлять соответствующими тегами, а то читать не возможно.
У меня нет желания изучать твои каракули, вот тебе работающий пример.
DWORD WINAPI TestThreadProc(LPVOID lpParameter)
{
// сигнализируем, что поток стартанул
::SetEvent((HANDLE)lpParameter);
// вот тут вызываем нашу волшебную функцию
// я вызову MessageBox();
// если не нажать OK в течение 5и секунд, поток буде прерван
::MessageBox(NULL, _T("Press OK to complete thread execution"), _T("Thread"),
MB_OK | MB_ICONINFORMATION);
return 0;
}
void OnTestThread(HWND hWnd)
{
// создаем событие которое будет сигнализировать старт потока
HANDLE hStartEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
if (!hStartEvent)
{
::MessageBox(hWnd, _T("Failed to create event"), _T("Error"),
MB_OK | MB_ICONSTOP);
return;
}
DWORD dwThreadId = 0;
// создаем поток,
// передаем дескриптор события в функцию потока
// в качестве параметра
HANDLE hThread = ::CreateThread(NULL, 0, TestThreadProc,
(LPVOID)hStartEvent, 0, &dwThreadId);
if (!hThread)
{
::CloseHandle(hStartEvent);
::MessageBox(hWnd, _T("Failed to create thread"), _T("Error"),
MB_OK | MB_ICONSTOP);
return;
}
// ждем старта потока
DWORD dwResult = ::WaitForSingleObject(hStartEvent, INFINITE);
// тут неплохо бы проверить dwResult
// но я не думаю что там может быть что-то плохое :)
// ок, поток стартанул
// ждем его завершения (1 сек),
// таймайт подбирай сам
dwResult = ::WaitForSingleObject(hThread, 5000);
if (dwResult == WAIT_OBJECT_0)
{
::MessageBox(hWnd, _T("Всё пучком!"), _T("Ура-а-а"),
MB_OK | MB_ICONINFORMATION);
}
else
{
::TerminateThread(hThread, 0);
::MessageBox(hWnd, _T("Waiting for thread complete failed"), _T("Error"),
MB_OK | MB_ICONSTOP);
}
::CloseHandle(hThread);
::CloseHandle(hStartEvent);
}
\/\/i||i
Re: Как в VC++ 6.0 вырубать функцию
От:
Аноним
Дата:
06.03.03 15:13
Оценка:
Здравствуйте, Alex777, Вы писали:
A>Как в VC++ 6.0 вырубать функцию если она не получила значение по истечению определенного времени спасибо