Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Borland C++ Builder 6 - Thread

[es] :: C/C++ programiranje :: Borland C++ Builder 6 - Thread

[ Pregleda: 2704 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

shonev
Beograd

Član broj: 38508
Poruke: 25
*.metadata.co.yu.

Sajt: tesla.rcub.bg.ac.yu/~shon..


Profil

icon Borland C++ Builder 6 - Thread 06.04.2005. u 14:49 - pre 231 meseci
Pokusao sam da stavim dva CGauge-a na formu koja ce da prate izvrsavanje dva inserta u bazu, evo koda, ali nesto ne stima,
uvek se odradi jedan pa drugi. Ima li neko ovakvih iskustava a spreman je da ih podeli sa drugima?

Unit1.cpp

TForm1 *Form1;
TMyThread *proc;
TMyThread *proc1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMyThread *proc = new TMyThread(false);
proc->Priority = tpNormal ;
proc->Suspend();

TMyThread1 *proc1 = new TMyThread1(false);
proc1->Priority = tpNormal;
proc1->Suspend();

proc->Resume();
proc1->Resume();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete proc;
delete proc1;
}
//---------------------------------------------------------------------------

Thread.cpp

//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
Synchronize(doo);
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::doo()
{
static int n;
int max = StrToInt(Form1->LEdit1->Text);
Form1->CGauge1->MaxValue = max;
for ( n=0; n<=max; n++ ){
Form1->SQL->SQL->Text = "insert into id (id,a,b,c) values ("
+ IntToStr(n) + ","
+ IntToStr(n*10) + ","
+ IntToStr(n*50) + ","
+ IntToStr(n*150) + ")";
Form1->SQL->ExecSQL(true);
Form1->CGauge1->Progress = n;
}
Application->ProcessMessages();
//ShowMessage("Uspesno insertovano " + IntToStr(max) + " redova.");
}
//---------------------------------------------------------------------------

Thread1.cpp

//---------------------------------------------------------------------------
__fastcall TMyThread1::TMyThread1(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread1::Execute()
{
Synchronize(dooo);
}
//---------------------------------------------------------------------------
void __fastcall TMyThread1::dooo()
{
static int n;
int max1 = StrToInt(Form1->LEdit1->Text) + StrToInt(Form1->LEdit1->Text);
Form1->CGauge2->MaxValue = max1;
for ( n=0; n<=max1; n++ ){
Form1->SQL->SQL->Text = "insert into id1 (a,b,c) values ("
+ IntToStr(n) + ","
+ IntToStr(n*10) + ","
+ IntToStr(n*150) + ")";
Form1->SQL->ExecSQL(true);
Form1->CGauge2->Progress = n;
}
Application->ProcessMessages();
//ShowMessage("Uspesno insertovano " + IntToStr(max) + " redova.");
}
//---------------------------------------------------------------------------
 
Odgovor na temu

toroman
Srećko Toroman
www.wowd.com
Beograd / Banja Luka

Član broj: 52673
Poruke: 159
*.dialup.blic.net.

Sajt: toroman.wordpress.com


Profil

icon Re: Borland C++ Builder 6 - Thread 08.04.2005. u 15:09 - pre 231 meseci
Mogao bi to da staviš u code blok jer ovako ništa ne mogu da pročitam :(
Programeri su odgovorili na Hamletovo pitanje "Biti il ne biti?" :
0x2B | ~0x2B = 0xFF
(kao ono - ff - teško pitanje!)
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: Borland C++ Builder 6 - Thread 08.04.2005. u 19:19 - pre 231 meseci
A wild-guess (jer odavno nisam koristio thread-ove u Builderu) :

Ti pokrecesh jedan thread, pa zatim drugi.

ALI, obe Execute() funkcije su "umotane" u Synchronise() blok - shto znachi da si ubacio celu funkciju u glavni VCL thread. Na taj nachin si onemogucio oba thread-a da se odvijaju istovremeno. Synchronize() bi trebao da se koristi samo za funkcije za koje nisi siguran da su thread-safe.
Prvo pitanje je - da li baza koju koristish podrzhava multi-threading. I drugo je pristup VCL komponentama.

Probaj da sinhronizujesh samo apdejt CGauge komponente, ostatak funkcije ostavi van thread-safe bloka.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Borland C++ Builder 6 - Thread 08.04.2005. u 19:32 - pre 231 meseci
Ako koristis:
Application->ProcessMessages();
samo zbog Update-ovanja CGauge, bolje probaj
CGauge->Update(); // mislim da bi trebalo da ima Update() metodu.
... jer je brze.

Takodje, u dugim petljama, bolje je
Application->ProcessMessages();
...pozivati svaki recimo 100-ti put.

if ( ( i % 100 ) == 0 )
Application->ProcessMessages();
 
Odgovor na temu

[es] :: C/C++ programiranje :: Borland C++ Builder 6 - Thread

[ Pregleda: 2704 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.