MessageBox - blokowanie aplikacji

dział ogólny

MessageBox - blokowanie aplikacji

Nowy postprzez Corvis » wtorek, 16 października 2012, 12:45

Witam,

Mam aplikację która "gada" z urządzeniem zewnętrznym po przez transmisję szeregową RS-232. Jak wywołamy funkcję MessageBoxW(....); Aplikacja się blokuje do czasu wciśnięcia przez użytkownika przycisku na MessageBox-ie ( robi to się automatycznie ) czy jest jakiś uniwersalny sposób na wychwycenie pojawienia się MessageBoxa i zamknięcie MessageBoxa ? ( nie chcę tego robić przed każdorazowym wywołaniem MessageBoxa bo mam tych wywołań w programie ok 200 ;) )

Próbowałem używać TApplicatiomEvent i tam funkcji OnDeactivate i OnActivate problem jest jednak taki, że te metody wywołują się jak minimalizuję i pokazuje formatkę.

Chciałbym zabezpieczyć program przed sytuacją gdy ktoś zostawi aktywnego MessageBoxa na dłużej - muszę zablokować nadawanie do urządzenia która jest robione w TTimerze w innej klasie.

Pozdrawiam,
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: MessageBox - blokowanie aplikacji

Nowy postprzez polymorphism » wtorek, 16 października 2012, 12:48

Nie rozumiem. To Twoja aplikacja?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: MessageBox - blokowanie aplikacji

Nowy postprzez Corvis » wtorek, 16 października 2012, 12:54

Moja,

Mógłbym to rozwiązać w następujący sposób. Przed każdym wywołaniem MessageBoxa zablokować TTimer który odpowiada za nadawanie danych do urządzenia. Nie chcę tego tak robić bo to za dużo roboty z tym jest, ze względu na dużą ilość wywołań MessageBox-ów. Szukam komunikatów API które powiedzą mi, że pojawił się / został zamknięty MessageBox.

Mam nadzieję, że teraz jest jasne :)
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: MessageBox - blokowanie aplikacji

Nowy postprzez polymorphism » wtorek, 16 października 2012, 12:59

Przenieś wysyłanie do oddzielnego wątka lub zrób swoją wersję MessageBoxa, która nie będzie blokować timera/wysyłania.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: MessageBox - blokowanie aplikacji

Nowy postprzez Corvis » wtorek, 16 października 2012, 13:02

Nie wiem czy oddzielny wątek ma jakiś sens bo jak odpalony jest MessageBox to jest jak by modalnie odpalony. Nie można klikać w formatkę pod spodem itp. Nie ma sensu, żeby "gadać" z urządzeniem w tej chwili, bo i tak dane się nie odświeżą ;) Na każde moje zapytanie urządzenie odpowiada.

I bez zablokowania tego. Timer chodzi ale nic się nie wysyła ani nie przychodzi.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: MessageBox - blokowanie aplikacji

Nowy postprzez Cyfrowy Baron » wtorek, 16 października 2012, 13:17

Message jest przywoływany jako okno modalne, dlatego dopóki nie zostanie zamknięty, blokuje aplikację.

Stwórz własne okno komunikatu, które będzie przywoływane jako niemodalne i jako zawsze na wierzchu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: MessageBox - blokowanie aplikacji

Nowy postprzez Corvis » wtorek, 16 października 2012, 13:20

No to jak nie da się przechwycić momentu w którym aplikacja staje się zablokowana przez MessageBox to będę musiał tak zrobić.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: MessageBox - blokowanie aplikacji

Nowy postprzez Cyfrowy Baron » wtorek, 16 października 2012, 13:22

Corvis napisał(a):przechwycić momentu


Po co to przechwytywać? Co by to zmieniło? Nowe okno blokuje wszystkie pod spodem to tak samo jakbyś jakieś okno przywołał funkcją ShowModal.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: MessageBox - blokowanie aplikacji

Nowy postprzez polymorphism » wtorek, 16 października 2012, 13:23

Nie wiem, może dzisiaj jakiś mam zły dzień, ale ni cholery nie rozumiem Twojego problemu. Mniejsza z tym...

Stwórz sobie funkcję, w której wywoływany jest messagebox i która informuje o pojawieniu/zamknięciu się okienka resztę aplikacji. Wszystkie wywołania MessageBoxW wewnątrz aplikacji zamień na swoją funkcję. Zapewne C++ Builder ma wyszukiwarkę tudzież inne narzędzie wspomagające refectoring kodu, więc problemu nie powinno być.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: MessageBox - blokowanie aplikacji

Nowy postprzez Corvis » wtorek, 16 października 2012, 13:29

Cyfrowy Baron napisał(a):
Corvis napisał(a):przechwycić momentu


Po co to przechwytywać? Co by to zmieniło? Nowe okno blokuje wszystkie pod spodem to tak samo jakbyś jakieś okno przywołał funkcją ShowModal.


Po to, że nie blokuje TTimera który jest w innej klasie i odpowiada za transmisję danych do urządzenia. Owszem okno zawiesi ale nie zawiesi TTimera i przez to zawieszone zostanie nadawanie na rozkazie który został wysłany w chwili pojawienia się MessageBoxa. TTimer będzie ładował cały czas dane do urządzenia - jeżeli do tego dodamy transmisję 1-wire możemy zrobić ładne cyrki w urządzeniu. Może trochę sytuacja jak z Matrixa ale jest możliwa.

Dobra napiszę swoją funkcję do MessgeBoxa będzie lepiej i szybciej.

Dzięki,

Edit.

Dla ciekawostki dodaję oscyloskop podłączony do RX i TX na porcie.

Modal.png


Czarna ramka - wygląd transmisji przed pojawieniem się modalnego komunikatu
Czerwona ramka - wygląd transmisji po pojawieniu się modalnego komunikatu
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: MessageBox - blokowanie aplikacji

Nowy postprzez Cyfrowy Baron » środa, 17 października 2012, 11:04

Skoro chcesz tworzyć własną funkcję wywołującą okno komunikatu, to może to cię zainteresuje:

KOD cpp:     UKRYJ  
 TForm *msDialog = CreateMessageDialog( L"Treść komunikatu", mtCustom, mbYesNo);

 int Idx = msDialog->ShowModal();

 switch(Idx)
 {
  case mrYes: Caption = "Tak"; break; /* tutaj mr a nie mb */
  case mrNo: Caption = "Nie"; break;
 }

 delete msDialog;

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron