jak przerwać działanie funkcji z poziomu innej funkcji

0

W czasie wywoływania funkcji odpalam Timer, po czym wykonuję czynność mogącą pochłaniać sporo czasu. Po jej wykonaniu zatrzymuję Timer. Chodzi o to, że jeśli ta czynność trwa zbyt długo, to OnTimer ma zatrzymywać wyżej wymienioną funkcję, tak jak robi to return. na razie korzystam z wątków i funkcji TerminateThread, ale ona nie czyści pamięci i po wątku zostają śmieci, tak przynajmniej jest napisane w MSDN. Funkcja ExitThread z kolei zamyka cały program, nie wiadomo czemu... z góry dziękuję za pomoc.

0

A gdybys np. uzależnił działanie od globalnej flagi (zmiennej globalnej), którą ustawiałbys (nadawałbyś wartośc nakazującą przerwanie pracy) gdy przychodzi sygnał z tajmera? W tej czasochłonnej funkcji podejrzewam, że jest jakaś pętla...

//Dopisane : No to niestety nie masz innej mozliwości jak poprzednia. W takim przypadku ja osobiście nie widzę innego niż nieeleganckie (zgadzam się, a niby czemu nie) rozwiązanie.

0

Tak, jest pętla, tylko że może wykonywać się strasznie dużo razy i dodawanie sprawdzenia może nieco spowolnić pracę programu. Poza tym to nieeleganckie... :-)

0

Ja mam tylko pytanie poco ??
W funkcji robisz tak ze jak cos sie wydazy to skacze w inne miejsce :P
czyli tak jak mowil flabra sprawdzasz za pomoca petli i zmiennej :P

0

No... chodzi o to, że jak do petli dodasz sprawdzenie, to wszystko chodzi nieco wolniej. Mogę dodać sprawdzenie zmiennej globalnej, którą zmienia Timer, albo po prostu sprawdzenie czasu, ale czy to jest najlepsze rozwiązanie? Nie lepiej w Timerze dodać coś, co zakończy wykonywanie tej funkcji? Czy to niemożliwe? na razie problem rozwiązuje funkcja TerminateThread umieszczona w OnTimer, ale potem trzeba znowu tworzyć wątek funkcją CreateThread, a to zaśmieca pamięc. A po co to wszystko? Petla ma się wykonywać maksymalnie przez jakiś tam okres czasu.

0

jak do petli dodasz sprawdzenie, to wszystko chodzi nieco wolniej
.

Ale dodawanie czegokolwiek powoduje wolniejsze działanie... int main(){return0;} będzie działało najszybciej (bez złośliwości).

Nie lepiej w Timerze dodać coś, co zakończy wykonywanie tej funkcji?

Nie widzę możliwości. Nawet kombinowanie ze wskaznikiem i zmiennym adresem skoku (jmp) nic nie da, bo z wnetrza ontimer nie widac wnetrza drugiej funkcji i ewentualnie zadeklarowanych labeli.

Petla ma się wykonywać maksymalnie przez jakiś tam okres czasu.

Po prostu dodaj przy sprawdzaniu warunek na sprawdzenie upływu czasu, zrob to tak, aby działało jak najszybciej, ale i tak warunek przecież musisz sprawdzic.

// Da się ! :) OpenProcess (jesli trzeba - nie sprawdzałem, ale raczej program powinien miec dostęp do wlasnego kodu) i grzebanie w bezposrednio kodzie... Na poczatku tamtej funkcji musisz ustawic dwa wskazniki globalne na adres rozkazu jmp ktory powoduje wyjscie z petli, a drugi wskazujacy na zewnetrzny label :] W OnTimer po prostu wysyłasz pod adres1+jakies przesuniecie adres 2 i jest spoko :) Aha funkcja z petla powinna sobie na wszelki wypadek zawsze przy odpaleniu ustawiac adres skoku na pierwszy label.

void* adres1;
void* adres2;

funkcja{
adres1=&label1;
adres2=&label2;
ustawwskokuadres(&label1);
petla{
asm{
jmp label1; // <-adres label 1 zmieniasz w ontimer na label2
}
label1:
}
label2:
}

ontimer{
ustawskokpodadresem(adres1-troche,adres2);
}

Tylko to wcale nie bedzie az tak wiele szybsze. Zamiast porównania w petli (cmp) masz skoki (jmp) i grzebanie na niskim poziome w kodzie, a po co ? Poza tym zawsze cos dochodzi, czy chcesz, czy nie.

albo bez grzebania... jeszcze lepszy pomysl...
troszke inaczej...

void* adres1;
void* adres2;

funkcja{
adres1=&label1;
adres2=&label2;
petla{
asm{
jmp pod adres1;
}
label1:
}
label2:
}

ontimer{
adres1=adres2
}

0

O to mi chodziło. Dzięki. Może i różnice w szybkości są niewielkie, ale przy większej ilości pętli wykonywanych w tym samym czasie (program jest wielowątkowy) da się to zauważyć. Jeszcze raz dzięki.

0

tworzysz nowy watek uzywajac klasy TThread (Builder) i w kazdej chwili mozesz go wylaczyc. A poniewaz jest to klasa to w jej destruktorze mozesz zwalniac pamiec.
Poza tym odsylam do kursow o watkach na <url>www.borland.nq.pl</url>.

//
cytuję : 'problem rozwiązuje funkcja TerminateThread umieszczona w OnTimer, ale potem trzeba znowu tworzyć wątek funkcją CreateThread, a to zaśmieca pamięc. A po co to wszystko?'

Czytaj proszę ze zrozumieniem [mf]

0
vixen03 napisał(a)

tworzysz nowy watek uzywajac klasy TThread (Builder) i w kazdej chwili mozesz go wylaczyc. A poniewaz jest to klasa to w jej destruktorze mozesz zwalniac pamiec.
Poza tym odsylam do kursow o watkach na <url>www.borland.nq.pl</url>.

//
cytuję : 'problem rozwiązuje funkcja TerminateThread umieszczona w OnTimer, ale potem trzeba znowu tworzyć wątek funkcją CreateThread, a to zaśmieca pamięc. A po co to wszystko?'

Czytaj proszę ze zrozumieniem [mf]

1 użytkowników online, w tym zalogowanych: 0, gości: 1