Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 04.03.03 15:42
Оценка:
Как в VC++ 6.0 вырубать функцию если она не получила значение по истечению определенного времени спасибо

04.03.03 21:53: Перенесено модератором из 'C/C++' в WinAPI — ХД
Re: Как в VC++ 6.0 вырубать функцию
От: Дмитрий Наумов  
Дата: 04.03.03 15:57
Оценка:
Здравствуйте, Alex777, Вы писали:

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


Сильный вопрос... Я, лично, ничего не понял, что ты хотел этим спросить.
... << RSDN@Home 1.0 beta 5 >>
Re: Как в VC++ 6.0 вырубать функцию
От: KonstBez  
Дата: 04.03.03 15:59
Оценка:
Здравствуйте, Alex777, Вы писали:

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


Насколько мне известно, "вырубают" (т.е. прерывают) не функции, а потоки, и не в VC, а в Windows. Например, TerminateThread. Или я што-то не так понял?
Re[2]: Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 04.03.03 16:15
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:

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

ДН>Сильный вопрос... Я, лично, ничего не понял, что ты хотел этим спросить.

Функция выполняет какие -то действия и зациклилась надо вырубить
Re[2]: Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 04.03.03 16:17
Оценка:
Здравствуйте, KonstBez, Вы писали:

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

KB>Насколько мне известно, "вырубают" (т.е. прерывают) не функции, а потоки, и не в VC, а в Windows. Например, TerminateThread. Или я што-то не так понял?

Работает функция зациклилась надо вырубить и продолжать работать
Re[3]: Как в VC++ 6.0 вырубать функцию
От: Дмитрий Наумов  
Дата: 04.03.03 16:24
Оценка:
Здравствуйте, Alex777, Вы писали:

A>Здравствуйте, Дмитрий Наумов, Вы писали:


ДН>>Здравствуйте, Alex777, Вы писали:


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


ДН>>Сильный вопрос... Я, лично, ничего не понял, что ты хотел этим спросить.


A>Функция выполняет какие -то действия и зациклилась надо вырубить


а. Не делать такую функцию — передизайнить!
б. Ввести внешний флаг и в этой зацикленной функции его проверять
... << RSDN@Home 1.0 beta 5 >>
Re[3]: Как в VC++ 6.0 вырубать функцию
От: Corvin Украина  
Дата: 04.03.03 16:26
Оценка:
Здравствуйте, Alex777, Вы писали:


A>Работает функция зациклилась надо вырубить и продолжать работать


Хорошо спросил...

Например если у тебя так:

  myfunction()
{
      while(1)
       {
            GetValue();
       }
}

то для того, чтобы ее вырубить надо написать, к примеру, вместо нее:
  myfunction()
{
      while(1)
       {
            if(!GetValue()) return;
       }
}


А вообще просто так вырубать повисшие функции нельзя, надо смотреть на код в каждом конкретном случае
Re[4]: Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 04.03.03 16:37
Оценка:
Здравствуйте, Corvin, Вы писали:

A>>Работает функция зациклилась надо вырубить и продолжать работать

C>Хорошо спросил...
C>... А вообще просто так вырубать повисшие функции нельзя, надо смотреть на код в каждом конкретном случае

Хорошо не корректно задал вопрос. В свою программу подключаю DLL. Беру оттуда функции
они могут вернуть число, а могут войти в бесконечный цикл. Доступа к той DLL у меня нет.
Re[4]: Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 04.03.03 16:39
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:

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

ДН>>>Сильный вопрос... Я, лично, ничего не понял, что ты хотел этим спросить.

Есть DlL, Беру функции,может нормально отработать, а может повиснуть.
Re[5]: Как в VC++ 6.0 вырубать функцию
От: Corvin Украина  
Дата: 04.03.03 16:54
Оценка:
A>Хорошо не корректно задал вопрос. В свою программу подключаю DLL. Беру оттуда функции
A>они могут вернуть число, а могут войти в бесконечный цикл. Доступа к той DLL у меня нет.

Первое, что приходит в голову, это вызывать функцию. в отдельной нити и если нить не вышла через заданный промежуток времени прибивать ее через terminatethread... Больше пока ничего в голову не приходит.. Хотя если хорошо знать ассемблер.......
Re[5]: Как в VC++ 6.0 вырубать функцию
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 04.03.03 16:57
Оценка:
Здравствуйте, Alex777, Вы писали:

A>Хорошо не корректно задал вопрос. В свою программу подключаю DLL. Беру оттуда функции

A>они могут вернуть число, а могут войти в бесконечный цикл. Доступа к той DLL у меня нет.

Тогда остается создавать поток, в котором делать вызов ф-ции и, если он не завершается сам, то завершать его с помощью TerminateThread.
... << RSDN@Home 1.0 beta 5 >>
Re[5]: Как в VC++ 6.0 вырубать функцию
От: KonstBez  
Дата: 04.03.03 16:58
Оценка:
Здравствуйте, Alex777, Вы писали:

A>Хорошо не корректно задал вопрос. В свою программу подключаю DLL. Беру оттуда функции

A>они могут вернуть число, а могут войти в бесконечный цикл. Доступа к той DLL у меня нет.

Могу посоветовать только одно: обращаться к DLL из отдельного потока и при необходимости рубить его. Например, варварским TerminateThread. Правда, ничего более корректного для такого случая я не знаю.
Re[6]: Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 04.03.03 16:59
Оценка:
Здравствуйте, Corvin, Вы писали:

A>>Хорошо не корректно задал вопрос. В свою программу подключаю DLL. Беру оттуда функции

A>>они могут вернуть число, а могут войти в бесконечный цикл. Доступа к той DLL у меня нет.
C>Первое, что приходит в голову, это вызывать функцию. в отдельной нити и если нить не вышла через заданный промежуток времени прибивать ее через terminatethread... Больше пока ничего в голову не приходит.. Хотя если хорошо знать ассемблер.......

Не надо ассемблер дай пример как с таймером работать
Re[6]: Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 04.03.03 17:00
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

ММ>Тогда остается создавать поток, в котором делать вызов ф-ции и, если он не завершается сам, то завершать его с помощью TerminateThread.


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

A>Не надо ассемблер дай пример как с таймером работать


Таймер не поможет, если все в одном потоке.
\/\/i||i
Re[7]: Как в VC++ 6.0 вырубать функцию
От: Corvin Украина  
Дата: 04.03.03 17:09
Оценка:
Могу предложить 3 варианта работы с таймером:
Вариант DOS:
time_t StoredValue;
time(&StoredValue)
while((time(NULL)-StoredValue)<Seconds_to_wait)
{}

Несмотря на то, что будет тормозить, имеет право на жизнь.

WINNT:
    LARGE_INTEGER liDueTime;
    liDueTime.QuadPart=-10000000;

    int err=0;

    UpdateTimer = CreateWaitableTimer(NULL, false, "UpdateTimer");
    if (UpdateTimer==NULL)
    {
        ErrorBox(GetLastError(),"Create UpWaitable Timer");
        ExitProcess(222);
    }

        DWORD waitres=WaitForSingleObject(UpdateTimer,true,INFINITE);

Здесь UpdateTimer будет сбрасываться каждую секунду, кажись (не помню точно, надо в МСДН глядеть).

И потом есть функция Sleep(), которая проводит в ничегонеделающем состоянии заланное время.
Re[8]: Как в VC++ 6.0 вырубать функцию
От: Corvin Украина  
Дата: 04.03.03 17:11
Оценка:
Вах-вах, забыл вставить
C>
C>    LARGE_INTEGER liDueTime;
C>    liDueTime.QuadPart=-10000000;

C>    int err=0;

C>    UpdateTimer = CreateWaitableTimer(NULL, false, "UpdateTimer");
C>    if (UpdateTimer==NULL)
C>    {
C>        ErrorBox(GetLastError(),"Create UpWaitable Timer");
C>        ExitProcess(222);
C>    }
    if (!SetWaitableTimer(UpdateTimer, &liDueTime, 1000, NULL, NULL, 0))
    {
        ErrorBox(GetLastError(),"Set UpWaitable Timer");
        ExitProcess(222);
    }


C>        DWORD waitres=WaitForSingleObject(UpdateTimer,true,INFINITE);
C>
Re[6]: Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 04.03.03 17:13
Оценка:
Здравствуйте, KonstBez, Вы писали:

KB>Могу посоветовать только одно: обращаться к DLL из отдельного потока и при необходимости рубить его. Например, варварским TerminateThread. Правда, ничего более корректного для такого случая я не знаю.


Примерчик скинь спасибо
Re[6]: Как в VC++ 6.0 вырубать функцию
От: Alex777  
Дата: 04.03.03 17:14
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

ММ>Тогда остается создавать поток, в котором делать вызов ф-ции и, если он не завершается сам, то завершать его с помощью TerminateThread.


Пример скинь плиз спасибо
Re[7]: Как в VC++ 6.0 вырубать функцию
От: Willi  
Дата: 04.03.03 17:16
Оценка:
Здравствуйте, Alex777, Вы писали:

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


что-то вроде

HANDLE hThread = CreateThread(...);
                 // передаем нужные парметры и уже в новом потоке 
                 // вызываем эту волшебную функцию

DWORD dwResult = WaitForSingleObject(hThread, dwTimeout);

if (dwResult == WAIT_OBJECT_0)
{
    // все пучком
}
else
{
    // не работает, зараза
    TerminateThread(hThread, 0);
}
\/\/i||i
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...
Пока на собственное сообщение не было ответов, его можно удалить.