Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 3 odgovora
  • 3.299 pregleda

Najnovija ↓

Borland C++ Builder 6 - Thread 06.04.2005. u 15:49 · pre 262 meseca #1
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.");
}
//---------------------------------------------------------------------------
Re: Borland C++ Builder 6 - Thread 08.04.2005. u 16:09 · pre 262 meseca #2
Mogao bi to da staviš u code blok jer ovako ništa ne mogu da pročitam :(
Potpis
Programeri su odgovorili na Hamletovo pitanje "Biti il ne biti?" :
0x2B | ~0x2B = 0xFF
(kao ono - ff - teško pitanje!)
Re: Borland C++ Builder 6 - Thread 08.04.2005. u 20:19 · pre 262 meseca #3
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.
Re: Borland C++ Builder 6 - Thread 08.04.2005. u 20:32 · pre 262 meseca #4
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();
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme