Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] Problem z przerwaniem funkcji

Ostatnio zmodyfikowano 2009-12-21 14:09
Autor Wiadomość
Patzick
Temat założony przez niniejszego użytkownika
[WinAPI] Problem z przerwaniem funkcji
» 2009-12-20 17:24:09
Mam dialog który wywołuje funkcję INT. Jednak jest problem gdyż funkcja ta nie chce się przerwać (pewnie nie zauważam czegoś istotnego, ale nie mam już pomysłu).
Dialog zaczyna się tak
C/C++
BOOL CALLBACK DlgLogowanie( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
    try { //do obsługi błędów, nieistotne
        if( WczytajIloscUzytkownikow() != 1 ) {
            // zamykam dialog jeśli błąd, czyli wartość !=1
I przechodzi mi do funkcji wczytującej, która wygląda tak:
C/C++
INT WczytajIloscUzytkownikow() {
    try {
        struct _finddata_t c_file;
        intptr_t hFile;
        // Znajdowanie plików .usr i wpisywanie ich do tablicy
        if(( hFile = _findfirst( "Users/*.usr", & c_file ) ) == - 1L ) {
            throw BLAD( ERR_LOAD_USR ); //ten błąd wychwytuje!
            _findclose( hFile );
            return 0; //tu powinna zwrócić wartość 0 i się skończyć
        }
        else {
            //część nieistotna
        }; //else
        return 1; //zwraca poprawne wykonanie
    } catch( cEXCEPTION Wyjatek ) { //obsługa wyjątków
        Wyjatek.Msg();
    };
}; //WczytajIloscUzytkownikow
I dzieje się tak: po wywołaniu nieistniejącego folderu ERR_LOAD_USR rzuca wyjątek i wyświetla się błąd. Jednak po tym funkcja powinna się zakończyć, a nie dzieje się tak i błąd wyskakuje ciągle (zwiesza działanie). Bez obsługi błędów po prostu się zawiesza, więc to nie jej wina.
Dzięki za jakąś podpowiedź, jeśli ktoś wie co nie tak ;)
P-12330
Elaine
» 2009-12-20 17:50:36
Pokaż całe DlgLogowanie()...
P-12331
Patzick
Temat założony przez niniejszego użytkownika
» 2009-12-20 18:03:05
C/C++
BOOL CALLBACK DlgLogowanie( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
    HWND h_Combo = GetDlgItem( hwnd, IDC_COMBO_LOGOWANIE );
    try {
        if( WczytajIloscUzytkownikow() != 1 ) {
            MessageBox( hwnd, "Żadne konto nie zostało znalezione. Żeby móc się zalogować najpierw załóż konto.", "Błąd logowania", MB_OK );
            EndDialog( hwnd, IDOK );
        } else {
            for( int i = 0; i < liczba_kont; i++ ) { //pętelka zmieniająca nazwy
                //kod
            } //for
           
            switch( Msg )
            {
            case WM_INITDIALOG:
                {
                    for( int i = 0; i < liczba_kont; i++ ) {
                        SendMessage( h_Combo, CB_ADDSTRING, 0,( LPARAM ) uzytkownicy[ i ].c_str() );
                    }
                    SendMessage( h_Combo, CB_SETCURSEL,( WPARAM ) Nr_logowania, 0 );
                }
                break;
            case WM_COMMAND:
                {
                    switch( LOWORD( wParam ) )
                    {
                    case IDOK_LOGOWANIE:
                        {
                            //procedura logowania
                        }
                        break;
                    case IDCANCEL_LOGOWANIE:
                        MessageBox( hwnd, "Logowanie przerwane", "Anulowane", MB_OK );
                        EndDialog( hwnd, IDOK_LOGOWANIE );
                        break;
                    }
                }
                break;
               
                default: return FALSE;
            }
           
            return TRUE;
           
        } //else
        ; } catch( cEXCEPTION Wyjatek ) {
        Wyjatek.Msg();
    };
}
Cóż nie wiem czy to coś pomaga, po tym pierwszym ifie wszystko się zwiesza.
P-12332
Elaine
» 2009-12-20 18:23:55
Czyli jak myślałem - WczytajIloscUzytkownikow() rzuca wyjątek, łapiesz go, wyświetlasz komunikat i tak przy każdym wywołaniu procedury dialogu... Po rzuceniu wyjątku sterowanie wchodzi do najbliższego pasującego catch i nie wraca, więc Wczytaj...() NIGDY nie zwróci zera. Pomyśl, co z tym fantem.
P-12335
Patzick
Temat założony przez niniejszego użytkownika
» 2009-12-20 18:49:50
Zrozumiałem to na dwa sposoby, jednak błędne.
1. skoro po rzuceniu wyjątku wpada do pierwszego catcha zmieniłem go na
C/C++
catch( cEXCEPTION Wyjatek ) {
    Wyjatek.Msg();
    return 0;
};
Co w rezultacie nie zmieniło całkiem nic.
2. Jeśli jest to wina wyjątków to z całej funkcji usunąłem wyjątki i zostawiłem tak
C/C++
if(( hFile = _findfirst( "Users/*.usr", & c_file ) ) == - 1L ) {
    _findclose( hFile );
    return 0;
}
Co również nie przyniosło pożądanego efektu, bo w tym momencie program się po prostu bezczelnie zwiesza(czyli to samo co było bez wywalania komunikatu o błędzie) :P
Może jakaś inna podpowiedź naprowadzi mnie na rozwiązanie ;)
P-12338
Elaine
» 2009-12-21 11:01:24
A co ma biedak zrobić, jak nie się zwiesić? Przecież na okrągło wywołujesz to Wczytaj...(), które zwraca zero (ew. rzuca wyjątek), w reakcji na co ty wywołujesz EndDialog, które, idę o zakład (bo dokumentacja milczy, ale to MS :>), wysyła jakiś komunikat do okna, na co wywołujeszcz Wczytaj...(), które zwraca zero (ew. rzuca wyjątek), w reakcji na co ty... yadda yadda yadda. Wywołuj tę funkcję RAZ, przy WM_INITDIALOG.
P-12367
Patzick
Temat założony przez niniejszego użytkownika
» 2009-12-21 14:09:32
:) wielkie dzięki
P-12369
« 1 »
  Strona 1 z 1