Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Debug Assertion?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.06.2004, 12:21 Uhr
Unwissende
...die wirklich Unwissende 8-)


Hi,
ärgere mich mit einer mit einer Debug Assertion rum.

Code:
_AFXWIN_INLINE BOOL CWnd::KillTimer(int nIDEvent)
    { ASSERT(::IsWindow(m_hWnd)); return ::KillTimer(m_hWnd, nIDEvent); }


Im Quelltext wird die wohl durch folgende Stelle "provoziert":

C++:
m_nTimer=SetTimer(3,100,NULL);
ASSERT(m_nTimer!=0);
....
KillTimer(3);



Hat jemand eine Idee, wie ich das Problem lösen könnte?
--
__________________________________
Unwissenheit ist vorläufig- Dummheit für immer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.06.2004, 12:38 Uhr
ao

(Operator)


Lies mal in der MSDN-Doku die Anwendungsbeispiele unter CWnd::KillTimer und CWnd::SetTimer, da wird KillTimer() mit m_nTimer als Argument aufgerufen und nicht mit dem Event-ID.

Wenn du dich jetzt fragst, warum der Parameter dann nIDEvent heißt: Das scheint mir ein Fehler zu sein, und das ist wohl auch der Grund dafür, dass diese doch recht einfache Angelegenheit mit einem vollständigen Beispiel dokumentiert ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.06.2004, 12:40 Uhr
~mike
Gast


Hi!
Also IsWindows warnt vor nem ungültigen Fenster Handle. Das passiert zum Beispiel, wenn man KillTimer in nem anderen Fenster auf ruft. Ist bei dir das SetTimer und KillTimer in der gleichen Klasse?

Anonsten würde ich

C++:
m_nTimer=SetTimer(3,100,0);
ASSERT(m_nTimer!=0);
....
KillTimer(m_nTimer);


schreiben

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.06.2004, 12:42 Uhr
~mike
Gast


äh. Zu langsam
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.06.2004, 13:49 Uhr
Unwissende
...die wirklich Unwissende 8-)


SetTimer und KillTimer sind bei mir in der gleichen Klasse, aber in verschiedenen Funktionenen der Klasse. Ich poste mal vorsichtshalber den relevanten Code:
--
__________________________________
Unwissenheit ist vorläufig- Dummheit für immer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.06.2004, 13:57 Uhr
Unwissende
...die wirklich Unwissende 8-)


Das ist der Timer, der dafür sorgt, dass die Progressbar aktualisiert wird:

C++:
void CComputeDlg::OnTimer(UINT nIDEvent)
{
        if (select_test_mode==true)
        {
            CProgressCtrl* pBar=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
            pBar->SetPos((i)*100/10); //der Test wird max. 100mal durchgeführt-eine willkürlich gewählte Zahl...
        }
        else //if (select_test_mode==false)
        {
            CProgressCtrl* pBar_1=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
            pBar_1->SetPos((i_add)*100/8388608);
        }
        

        CDialog::OnTimer(nIDEvent);
}




Das ist der Code, (der hinter dem Button auf der Oberfläche steht) ist: (oh Mann, vor lauter Englisch kann ich kein Deutsch mehr *wahhh*)

C++:
void CComputeDlg::OnStartAddr()
{
    int            err_num=0;
    UINT32        start_address;
    UINT32        end_address;
    FILE        *fp;
//
    start_address = g_val;
    end_address = start_address + g_size - 1; //Byte-Adressierung
    range = end_address - start_address;
    select_test_mode=false;    
    
    /*GetDlgItem(IDC_START)->EnableWindow(TRUE);
    GetDlgItem(IDC_START_ADDR)->EnableWindow(TRUE);*/

    //GetDlgItem(IDC_Text_Addressline)->ShowWindow(TRUE);
    //GetDlgItem(IDC_Text_Dataline)->ShowWindow(FALSE);

    
    
    //g_size= 32MB= 33554432Bytes= 268435456Bit
    //that means: 8M =8388608 Datawords (32Bit each)
    fp= get_fp();
    if (fp)
    {
        fprintf(fp, "\nAddressline Test....\n");
    }

    err_num = err_num + check_addressline(start_address,  end_address);
    
    }

    getBackError=(UINT8)err_num + getBackError;

}



und hier die Fkt., also die Implementierung des eigentlichen Tests:

C++:
int CComputeDlg::check_addressline(unsigned long start, unsigned long end)
{
    UINT32        *addr;     //pointer to first memory location
    UINT32        value_r;   //value read from memory
    UINT32        value_w=0; //value to write to memory
    UINT32        err_count=0; //number of detec
    UINT32        mask = 0xFFFFFFFF;
    MSG            message;
    FILE        *fp;

    m_nTimer=SetTimer(2,100,NULL);
    ASSERT(m_nTimer!=0);
    fp= get_fp();

    
    addr=(UINT32*)start; //wird addr +4 hochgezählt? -->jep!
    while (addr <=(UINT32*)end)
    {
        *addr++=value_w++;   //writes a ramp into the memory
        //addr=addr+4;
    }
  
    addr=(UINT32*)start + 4 ; // Fehler generieren
    *addr= 55;

    addr=(UINT32*)start;
    while(addr <= (UINT32*)end)
    {
        value_r=(*addr++) & mask;
    /*    dummy_1=value_r;
        value_w--;*/

        i_add++;

        if (::PeekMessage(&message,NULL,0,0,PM_REMOVE))  //cancel of ramtest possible
        {
            ::TranslateMessage(&message);
            ::DispatchMessage(&message);
        }

        //addr=addr+4;  //wortweise
        if (value_r != value_w++ & mask)
        {    
        //in case of an error:
        if (fp) //&& (prot_addr_err<= MAX_ERR))
            {
                fprintf(fp,"0x%.08x:  w: %d\t r: %d\n",addr, value_w, value_r);
            }
            err_count++; //increments no. of errors
        }
        if (err_count>=MAX_ERR)
        {
            return err_count;
        }
        
    }
    KillTimer(2);
    return err_count;
}


und hier der Code für einen Abbruchbutton. NAch drücken von diesem kommt eben diese Debug-Assertion:
(Naja, bisher wird ja nur die Fkt OnCancel der Basisklasse aufgerufen, mehr nicht...)

C++:
void CComputeDlg::OnCancel2() //OK-Button auf der GUI
{
        abbr=true;
        ij=100;
    //    KillTimer(1);
    //    KillTimer(2);
        CDialog::OnCancel();
}


--
__________________________________
Unwissenheit ist vorläufig- Dummheit für immer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.06.2004, 14:00 Uhr
Unwissende
...die wirklich Unwissende 8-)


Also, ich glaube, das Problem könnte daran liegen, dass ich wenn ich den Test abbrechen will, also OnCancel2 aufrufe, der Timer nicht ordungsgemäß gekillt wurde..?!?!
--
__________________________________
Unwissenheit ist vorläufig- Dummheit für immer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.06.2004, 15:03 Uhr
mike
Pinguinhüpfer
(Operator)


Was passiert wenn du den Code auf

C++:
m_nTimer=SetTimer(3,100,0);
ASSERT(m_nTimer!=0);
....
KillTimer(m_nTimer);


änderst?

Denn SetTimer gibt folgendes zurück:
The timer identifier of the new timer if the function is successful.
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.06.2004, 16:23 Uhr
Unwissende
...die wirklich Unwissende 8-)


Hab ich jetzt grad mal versucht:
Die Debug Assertion bleibt......Au Mann.....
--
__________________________________
Unwissenheit ist vorläufig- Dummheit für immer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.06.2004, 16:55 Uhr
~mike
Gast


Das ist natürlich schlecht. Also was SetTimer und KillTimer betrifft sehe ich sonst keine Fehler.
Ich hätte nur mehr 2 Ideen
1.

C++:
int CComputeDlg::check_addressline(unsigned long start, unsigned long end)
{
   m_nTimer=SetTimer(3,100,0);
   ASSERT(m_nTimer!=0);
   KillTimer(m_nTimer);
}


Also wenn das auch nicht geht, muss der Fehler außerhalb der Funktion liegen - funtzt das Ganze - ist in der Funktion ein Fehler.

2.

C++:
::SetTimer(GetSafeHwnd(),3,100,0); // oder ::SetTimer(NULL,3,100,0);
::KillTimer(GetSafeHwnd(), 3); // oder ::KillTimer(NULL, 3);


Sollte normal egal sein - Veruch is es Wert

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: