Как в 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
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.