expertenaustausch > microsoft.* > microsoft.vc

Michaela Brauner (26.05.2010, 12:01)
Hallo,
was kann ich hier tun.
Seit der Umstellung geht es nicht mehr.

Grüße Michaela

File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxmt.in l
Line: 89

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: \\192.168.4.55\C$\braunerP1\Debug\BAppNewCan.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxmt.in l
Line: 89

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
Abort Retry Ignore
---------------------------

CCriticalSection cs;

cs.Lock(400);

MacheWas
do{

}
while()

cs.Unlock();
Ulrich Eckhardt (26.05.2010, 13:00)
Michaela Brauner wrote:
> was kann ich hier tun.
> Seit der Umstellung geht es nicht mehr.


Moment, was genau geht nicht mehr?

> File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxmt.in l
> Line: 89
> ---------------------------
> Microsoft Visual C++ Debug Library
> ---------------------------
> Debug Assertion Failed!
> Program: \192.168.4.55\C$\braunerP1\Debug\BAppNewCan.exe
> File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxmt.in l
> Line: 89


Lies mal die Zeile und eventuell was fuer ein Kommentar darueber steht, das
gibt meistens einen Einblick in die Problematik. Ansonsten verrat doch mal
was da steht.

> CCriticalSection cs;
> cs.Lock(400);
> MacheWas
> do{
> }
> while()
> cs.Unlock();


Ahem, eine lokale Instanz von CCriticalSection? Das macht meistens keinen
Sinn, weil diese Variable muss natuerlich von den Threads sichtbar sein die
damit den Zugriff auf die assoziierte Resource koordinieren wollen.

Ansonsten, kann es sein dass zwischen dem Lock() und Unlock() ein return ist
oder dass eine Exception geworfen wird? Dann wird naemlich Deine
CCriticalSection zerstoert waehrend der Lock gehalten wird. Ausserdem die
Frage (hab' jetzt nicht nachgesehen) was "cs.Lock(400);" macht und was es
zurueckgibt. Ich vermute 400 ist der Timeout, aber wie unterscheidest Du
zwischen Erfolg und Timeout?

Noch eins: Benutz' nie Lock() und Unlock() direkt. Statt dessen nimm lieber
CSingleLock:

CCriticalSection global_mutex;
CFile global_logfile;

void Log(CString s)
{
// automatisches Lock im Constructor
CSingleLock lock(&global_mutex, TRUE);
// Resource benutzen
global_logfile.Write(s);
// automatisches Unlock im Destructor
}

Weiteres in der Doku, und ich hab' das nur aus'm Kopf geschrieben, nicht
kompiliert. Das Prinzip sollte aber stimmen.

Uli
Martin Richter [MVP] (26.05.2010, 13:50)
Hallo Michaela!

[..]
> ---------------------------
> CCriticalSection cs;
> cs.Lock(400);


Das ist ein Witz oder?
Man kann bei einer CCriticalSection keine Wartezeit angeben.

Das ging in noch keiner MFC Version.

Die Code Stelle zeigt dies doch klar oder?
_AFXMT_INLINE BOOL (::CCriticalSection::Lock(DWORD dwTimeout))
{ ASSERT(dwTimeout == INFINITE); (void)dwTimeout; return Lock(); }
Ähnliche Themen