Link to home
Start Free TrialLog in
Avatar of cleaverX
cleaverX

asked on

TCriticalSection not working

Hi,

I made a little test program to test the working of critical sections, but it doesn't give the result I want.
I have 2 forms with each a button on.  When clicking buIncrease, the program counts from 0 to 100.  When it is counting and the couter is at 50 (eg) , i click on the button on the second form, wich calls the same function of when clicking the first button.  The result is that the label laThread1Status displays 0 to 50 and then counts from 0 to 100 (which is done by the second call), and when it reaches 100, it restarts counting from 50 to 100 (which is the first call that is resumed).
The criticalsection should make sure that the first call first has to be completed, no..?

void __fastcall TForm1::buIncreaseClick(TObject *Sender)
{
        int max = 100;
        csList->Acquire();   //TCriticalSection
        for(int i=0;i<max;i++)
        {
                laThread1Status->Caption = "running: "+IntToStr(i);
                laThread1Status->Repaint();
                Sleep(250);
                Application->ProcessMessages();
        }
        laThread1Status->Caption = "finished";
        laThread1Status->Repaint();
       csList->Release();
}

void __fastcall TForm2::Button2Click(TObject *Sender)
{
        Form1->buIncreaseClick(NULL);
}




Avatar of cleaverX
cleaverX

ASKER

The critical section does not protect against "concurrent" access from within the same thread...
This has more to do with events I think...
how can i force a function to finish before this same function is called by an event...?
what is the declaration and initialisation of csList?
ASKER CERTIFIED SOLUTION
Avatar of AdrianSRU
AdrianSRU

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial