@kiero, post #2
@peceha, post #4
Na razie czytalem tylko ogolnie i nawet nie wiem jak mialbym komunikowac ten drugi proces z moim programem, a komenda CreateNewProc() to wciaz czarna magia.
Moglby ktos mi zaoszcedzc czasu i napisac co to NP_Seglist lub NP_Entry ?
Czy mam uzyc LoadSeg()? o co tu wogole chodzi....
co to jest "Scatterload a loadable file into memory"
Czy to wszystko bedzie mi potrzebne by wystartowac drugi proces z mojego programu?
@peceha, post #4
@peceha, post #4
struct Process *Proc_Procedura = NULL; struct Task *Task_MainTask; void Procedura(void); int main(void) { T_MainTask = FindTask(NULL); Proc_Procedura = CreateNewProcTags(NP_Entry, (ULONG)&Procedura, NP_Priority, 0, NP_Name, (ULONG)"Cos_tam", TAG_END); // jaks dalsza czesc programu ..... // przy zakonczeniu calego programu czekaj az drugi task skonczy Wait(SIGBREAKF_CTRL_C); } void Procedura(void) { ...... // jakas procedura // a teraz wyjscie przy zamykaniu programu Forbid(); Signal(T_MainTask, SIGBREAKF_CTRL_C); Permit(); }
@Phibrizzo, post #8
@Phibrizzo, post #8
@Hexmage960, post #5
Procesy komunikują się przez porty. Po prostu tworzysz port za pomocą CreateMsgPort(), przekazujesz tworzonemu procesowi (jako parametr dla CreateNewProc()) a następnie wysyłasz (PutMsg()) oraz odbierasz (GetMsg()) wiadomości.
@docent, post #10
Poza tym dostep do T_MainTask powinien byc zabezpieczony mutexem lub semaforem zamiast Forbid/Permit
Peceha raczej chodzi o sterowanie sub taskiem z glownego procesu tak aby ui nie blokowalo dekodowania plikow, czyli powinno sie zastosowac porty i wiadomosci.
@Jacek Piszczek, post #13
Absolutnie nie wolno używać SIGB_SINGLE. Możesz odblokować randomowy semafor w ten sposób. Od tego jest AllocSignal.
@mschulz, post #12
1. W czasie tworzenia procesu potomnego jest startowana przykladowa funkcja. Stos ustawiony jest tak, ze po jej zakonczeniu zostanie wywolane automatycznie RemTask.
Wywolanie Permit() po wyslaniu sygnalu to proszenie sie o klopoty, zwlaszcza jezeli ten sygnal pozwoli procesowi glownemu zakonczyc dzialanie. W zaleznosci od tego w jakiej relacji byly priorytety obu procesow i w zaleznosci od poziomu pecha moze sie nic nie wydarzyc, moze ewentualnie zadzialac albo moze sie wszystko wysypac.
W tym wypadku zrobilbym to tak:
1. Proces glowny inicjalizuje zmienna globalna T_MainTask (FindTask(NULL)).
2. Proces glowny tworzy nowy proces po czym natychmiast czeka na sygnal. W tym wypadku nie uzylbym sygnalu CTRL_C tylko czegos bardziej stosownego jak na przyklad SINGLE (uzywany tez np. przy semaforach)
3. Proces potomny inicjalizuje wszystko co potrzebne do komunikacji z procesem glownym: MessagePort i wszystko inne.
4. Proces potomny wysyla do T_MainTask sygnal SINGLE: Signal(T_MainTask, SIGBREAKF_SINGLE) po czym przechodzi do petli w ktorej obsluguje komunikacje z glownym procesem i wykonuje prace do ktorej zostal stworzony.
Zakonczenie pracy mozna zsynchronizowac w podobny sposob, byle tylko po ostatnim sygnale wyslanym z potomnego procesu nie odblokowywac schedulera.
@docent, post #15
To od pecha nie zalezy :)
Jesli uzyjesz Permit, to wywola on scheduler - w efekcie sa 4 mozliwosci zachowania sie systemu:
1. Jesli biezacy task (sub task) jest w stanie wyjatku, wywoluje jego obsluge wyjatku z TaskExceptCode
2. Jesli nastepny gotowy task ma wiekszy priorytet, jest on przelaczany i wykonywany
3. Jesli nastepny gotowy task ma mniejszy/rowny priorytet i quantum subtasku jeszcze nie minelo -> subtask jest dalej wykonywany
4. Jesli nastepny gotowy task ma mniejszy/rowny priorytet i quantum subtasku juz minelo -> nastepny gotowy task jest przelaczany i wykonywany
Klopoty moga sie pojawic tylko w przypadku 2 i 4, gdy glowny task ma priorytet wyzszy/rowny priorytetowi sub tasku i moze zakonczyc prace przed sub taskiem, co moze zakonczyc sie crashem. Jesli glowny task ma ten sam priorytet co sub task to punkt 2 nie ma znaczenia i pozostaje tylko punkt 4
Wystarczy wiec by sub task mial priorytet wiekszy od glownego by zastosowanie Permit bylo calkowicie bezpieczne.
to takie hakerskie rozwiazanie, ktore w tym przypadku pewnie zadziala, ale tylko jesli subtask ma wyzszy priorytet niz glowny task. Latwo tu o jakies przeoczenie i trudny do zlokalizowania blad
@mschulz, post #16
@mschulz, post #16
na dokladke nie kontrolujemy quantum,
to nie zakladajmy z gory ze ustawienie wyzszego priorytetu zalatwia sprawe na zawsze.Tego nie napisalem
Wystarczy ze Pecha zmieni kiedys priorytet subtasku z jakiegos powodu zapominajac o tym, ze uzyl "calkowicie" bezpiecznego Permit() albo zainstaluje sobie jakis super-hiper nowy scheduler ktory nie bedzie sie trzymal wyzej wymienionych zasad.
Pozwol ze zacytuje jednoczesnie lekko modyfikujac cytat (modyfikacja pogrubiona ):
"to takie hakerskie rozwiazanie, ktore w tym przypadku pewnie zadziala, ale tylko jesli subtask ma wyzszy priorytet niz glowny task. Latwo tu o jakies przeoczenie i trudny do zlokalizowania blad"
A z mojej strony, widzialem juz i poprawialem kod ktorego autor mial podobne zalozenia tyle ze odnosnie momentu tworzenia subtasku. Potem zmienil priorytety i trzeba bylo grzebac w kodzie i dociekac dlaczego subtask widzi pewne zmiennie niezainicjalizowane, mimo ze przeciez sa w kodzie ustawione ;)
@peceha, post #1
@peceha, post #19
@Krashan, post #20