Re[9]: Как в VC++ 6.0 вырубать функцию
От: Willi  
Дата: 04.03.03 17:21
Оценка:
Здравствуйте, Corvin, Вы писали:

C>Вах-вах, забыл вставить


А зачем ему все эти навороты, когда есть WaitForSingleObject?
\/\/i||i
Re[8]: Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 04.03.03 17:25
Оценка:
Здравствуйте, Willi, Вы писали:

A>>Как узнать она завершилась или просто тормозит дай примерчик если есть

W>что-то вроде... (код пропущен)

Слушай а как узнать, что она не работает, а не тормозит?
Re[8]: Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 04.03.03 17:26
Оценка:
Здравствуйте, Corvin, Вы писали:

как узнать она зависла или тормозит просто
Re[9]: Как в VC++ 6.0 вырубать функцию
От: comer США http://getboost.codeplex.com/
Дата: 04.03.03 18:53
Оценка:
Здравствуйте, Alex777, Вы писали:

A>как узнать она зависла или тормозит просто

Сначало надо дать четкую грань между зависла и тормозит. Думаю такой нет.
getboost.codeplex.com
citylizard.codeplex.com
Re[10]: Как в VC++ 6.0 вырубать функцию
От: Willi  
Дата: 05.03.03 08:37
Оценка:
Здравствуйте, 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 не знаешь
Re[9]: Как в VC++ 6.0 вырубать функцию
От: Willi  
Дата: 05.03.03 09:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот за WaitForSingleObject тебе большое Человеческое Спасибо хороший человек.


Хм, не понял, что-то не так?

А>а Ты ERP SAP R/3 не знаешь


Слышал такое слово, и даже один скриншот видел
А при чем тут это?
\/\/i||i
Re[7]: Re: Re[6]: Как в VC++ 6.0 вырубать функцию
От: promko Украина  
Дата: 05.03.03 09:55
Оценка:
"Alex777" <forum@rsdn.ru> wrote in message news:207358@news.rsdn.ru...
> Как узнать она завершилась или просто тормозит дай примерчик если есть

Можно просто предположыть сколько <b>максимально</b> может занять вызов функции из ДЛЛ и если по истечению этого времени поток управление не возвращает тогда убивать его нужно

hThread = CreateThread(...); // _beginthreadex
dwWaitResult = WaitForSingleObject(
hThread, // handle to thread
5000L); // five-second time-out interval

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 потоке вызвать функцию
Re[8]: Re: Re[6]: Как в VC++ 6.0 вырубать функцию
От: Willi  
Дата: 05.03.03 12:04
Оценка:
Здравствуйте, promko, Вы писали:


P>case WAIT_ABANDONED:


В случае с ожиданием потока такого результата не бывает
\/\/i||i
Re[9]: Re: Re[6]: Как в VC++ 6.0 вырубать функцию
От: Willi  
Дата: 05.03.03 12:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А как в hThread потоке вызвать функцию


Так же как и в любом другом месте программы
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    SomeFunction(/* prameters list*/);
    return 0;
}
\/\/i||i
Re[10]: Re: Re[6]: Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 05.03.03 12:31
Оценка:
Здравствуйте, Willi, Вы писали:

W>Здравствуйте, Аноним, Вы писали:


А>>А как в hThread потоке вызвать функцию


W>Так же как и в любом другом месте программы

W>
W>DWORD WINAPI ThreadProc(LPVOID lpParameter)
W>{
W>    SomeFunction(/* prameters list*/);
W>    return 0;
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);
}

CloseHandle( hThread );



ThreadFunc — бесконечный цикл
Re: Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 05.03.03 13:25
Оценка:
Здравствуйте, Alex777, Вы писали:

A>Как в VC++ 6.0 вырубать функцию если она не получила значение по истечению определенного времени спасибо

up
Re[2]: Как в VC++ 6.0 вырубать функцию
От: IPv6 Казахстан  
Дата: 05.03.03 14:44
Оценка:
Здравствуйте, 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 вырубать функцию
От: Willi  
Дата: 05.03.03 17:59
Оценка:
Здравствуйте, 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 вырубать функцию если она не получила значение по истечению определенного времени спасибо



Все работает. Всем спасибо
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.