Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[delphi] jak "zabić" swoją aplikację ?

22 Kwi 2009 08:51 1743 7
  • Poziom 29  
    Witam.
    Mam taki problem, że czasem podczas komunikacji przez usb zawiesza się aplikacja - jest to konwerter usb/com i przy próbie wyjścia z programu i próbie zamknięcia portu który jest niby otwarty zawiesza się aplikacja i niedarady jej zamknąć - czy można w jakiś sposób z poziomu programu ją "zabić" tak jak w menadżerze zadań windows ? tylko w ten sposób mogę odblokować port i zamknąć aplikację. zawieszenie następuje przy poleceniu CloseHandle() umieszczonym w onColse aplikacji....
  • Poziom 31  
    Jakiego konwertera używasz? W moim odczuciu "zabijanie" procesów raczej nie jest właściwy sposobem rozwiązania problemu. Poza tym jeżeli aplikacja już się zawiesiła to jak chcesz ją "zabić"? Inną aplikacją (wątkiem) działającą w tle?
  • Poziom 12  
    Witam

    W moim odczuciu kolega czeka w pętli na flagę gotowości lub coś podobnego. Proponował bym prześledzić cały kod odnośnie komunikacji.

    Osobiście komunikację po COM zawsze robiłem w oddzielnym wątku z powodu tego, że podczas komunikacji program zamierał, a w przypadku oddzielnego wątku jeśli gdzieś się zacięło z komunikacją to klikając zamknij program zawsze go zamykało zabijając wątek :)

    Pozdrawiam :)

    Ps. Piszę w Freepascal "LAZARUS" przynajmniej darmowy i mogę sprzedawać soft bez obawy wpadki za nielegalne oprogramowanie :)
  • Poziom 29  
    ja używam TurboDelphiExplirer i też jest darmowy do celów komercyjnych ale pomijając to wróćmy do tematu.

    W procedurze onClose głównej formy mam jedną linijkę:

    CloseHandle(hCommDev); Wszystko działa w porządku gdy wszystko jest ok... ale jeśli np. wyciągniesz wtyczkę z usb to niedarady zamknąć programu bo właśnie zwisa w chwili wykonywania CloseHandle... - wtedy jedyne wyjście to AltCtrlDel....
  • Poziom 16  
    Rozwiązanie jest banalnie proste...Jak wyciągasz USB to Windows gubi port COM i nie mozna zamknąć czegoś co nie istnieje...Zatem trzeba zrobić tak :

    if(FlushFileBuffers(hcomdev)=true)then
    CloseHandle(hcomdev);

    Dzięki temu jak port znika to program go nie zamknie
  • Poziom 29  
    oj teraz to mi się zawiesza na FlushFileBuffers(hcommdev) :( czyli zawsze jak próbuję odwołać się do "felernego" uchwytu :(
  • Poziom 12  
    Witam
    Po co sobie komplikować, trzeba założyć, że do chwili zamknięcia portu on istnieje :)

    W każdym razie trzeba założyć pułapki jeżeli port istnieje to wyślij odbierz ustaw itp jeżeli nie połącz jeśli błąd to alert...

    Pozdrawiam
  • Poziom 29  
    poradziłęm sobie zamykając port po każdej "sesji" transmisyjnej i otwieranie ponownie w razie potrzeby. nie mam teraz ryzyka że podczas otwartego portu ktoś czasem nie odłączy urządzenia od usb (wcześniej był on otwarty tak długo jak długo uruchomiony program) . Już wszsytko działa - dzięki za podpowiedzi.