Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Threads syncronisieren ?

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 <
000
24.02.2004, 12:53 Uhr
~global
Gast


hi,
ich arbeite gerade an einer anwendung mit mehreren threads.
diese threads machen eine ausgabe in einem CListCtrl im hauptdialog:


C++:
void CSeite2::SetStatus(CString Value)
{
    int nCnt = m_lStatus.GetItemCount();

    CString time = GetTime();
    int i = m_lStatus.InsertItem(nCnt, (( time == m_sLastTime ) ? "" : time) );
    m_lStatus.SetItemText(i, 1, Value);
    m_lStatus.EnsureVisible(i,FALSE);
    if ( m_bEventLog )
    {
        Value = time + " " + Value + "\n";
        fwrite(Value, sizeof(char), Value.GetLength(), m_fEvent);
    }
    m_sLastTime = time;

    return;
}


leider scheinbar zeitgleich, und so passiert es das die eine oder andere zeile im listctrl leer bleibt, komischer weisse in der log-datei welche mit fwrite gefüllt wird, stehen alle ausgaben in der richtigen reihenfoge drin (bestimmt weils ein stream iss)...

also was kann ich machen das das listctrl richtig gefüllt wird ?
--
thx
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.02.2004, 14:02 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Ich glaube da gabs irgendwo eine Option "Automtaisches Sortieren" oder so. Die musst ausschalten

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.02.2004, 14:59 Uhr
RHBaum




Zitat:

also was kann ich machen das das listctrl richtig gefüllt wird ?


wenn mehre Threads gleichzeitig auf ein Object (Intsanz einer Klasse oder ne Variable) zugreifen koennten, musst die Threadsicher machen !

Sprich, du must garantieren, das nur ein thread aufs mal einen bestimmten codeabschnitt ausfuehrt ....

Thread sonchronisation ist schon mal nen richtiges Stichwort.
Genauere Hilfe findest bei
a: CriticalSection
b: Events + WaitForSingleObject / WaitForMultiObject
... und weitere

in deinem Fall einfach, gibt deinem Listcontrol ne CriticalSection als member ....
Und bei allen aktionen die lesend und schreibend schreiben drauf zugreifen, machst nen Lock davor, udn wennst wieder Rausgehst nen Unlock.

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.02.2004, 01:47 Uhr
~global
Gast


erstmal danke, werd mir das anschauen... hab dann sicher noch die eine oder andere frage, ist mein erstes projekt was threads etwas umfangreicher nutzt.
--
thx
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.02.2004, 12:22 Uhr
~global
Gast


hi, also es scheint zu funktionieren, hier mal der code:

C++:
class CSeite2 : public CDialog
{
// Konstruktion
public:
...
// ******************************************
    CRITICAL_SECTION CriticalSection;
// ******************************************
...
}

void CSeite2::InitDialog()
{
// ******************************************
    InitializeCriticalSection(&(CriticalSection));
// ******************************************
...
}

void CSeite2::SetStatus(CString Value)
{
// ******************************************
    EnterCriticalSection(&(CriticalSection));
// ******************************************
    int nCnt = m_lStatus.GetItemCount();

    CString time = GetTime();
    int i = m_lStatus.InsertItem(nCnt, (( time == m_sLastTime ) ? "" : time) );
    m_lStatus.SetItemText(i, 1, Value);
    m_lStatus.EnsureVisible(i,TRUE);
    if ( m_bEventLog )
    {
        Value = time + " " + Value + "\n";
        fwrite(Value, sizeof(char), Value.GetLength(), m_fEvent);
    }
    m_sLastTime = time;
// ******************************************
    LeaveCriticalSection(&(CriticalSection));
// ******************************************
    return;
}

void CSeite2::OnClose()
{
...
// ******************************************
    DeleteCriticalSection(&(CriticalSection));
// ******************************************
    CDialog::OnOK();
}

wenns das wirklich schon war, dann wars ja wirklich einfach...
--
gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.02.2004, 11:40 Uhr
RHBaum



Naja, dein Fall ist ja auch ziemlich einfach :p
Intressanter wirds wenn du ne eventsteuerung hast und die Threads mit mehreren Modulen kommunizieren ... und die module im gelockten zusatend funktionen aus dem anderen modul aufrufen, was auch nen Lock erfordert, welcher sich aber mit dem vorhandenen schon beisst etc :p

Deadlocks sind ne nette Sache, schonen Systemressourcen ungemein



Ciao ...

Dieser Post wurde am 26.02.2004 um 11:41 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: