Witam,
Mam oto taką funkcję którą wywołuję w pętli co 0.2 s. na czas testów nie robię Sleep aby wykryc wszystkie błędy.
void TForm1::PrintScreen()
{
int x = kalibracjaPx;
int y = kalibracjaPy;
TCanvas &PulpitCanvas = *new TCanvas();
Graphics::TBitmap *Bmp = new Graphics::TBitmap;
Bmp->Width = 94;
Bmp->Height = 15;
PulpitCanvas.Handle = GetDC(0);
Bmp->Canvas->Lock();
Bmp->Canvas->CopyRect(Rect(0, 0, 94, 15), &PulpitCanvas, Rect(x, y, x+94, y+15));
Bmp->Canvas->Unlock();
Image1->Canvas->Lock();
Form1->Image1->Picture->Assign(Bmp);
Image1->Canvas->Unlock();
ReleaseDC(0, PulpitCanvas.Handle);
delete &PulpitCanvas;
delete Bmp;
for(int i = 0; i<94; i++)
{
for(int j = 0; j<15; j++)
{
pixtab[i][j].r = GetRValue(Form1->Image1->Canvas->Pixels[i][j]);
pixtab[i][j].g = GetGValue(Form1->Image1->Canvas->Pixels[i][j]);
pixtab[i][j].b = GetBValue(Form1->Image1->Canvas->Pixels[i][j]);
pixtab[i][j].sum = pixtab[i][j].r + pixtab[i][j].g + pixtab[i][j].b;
}
}
}
I teraz co sie okazuje - jeżeli kliknę Buttona a tam jest for(od 1 do 1000) i woła PrintScreen to wszystko jest ok.
Natomiast Jeżeli tworzę wątek i wywołuję w pętli powyższa funkcję to po kilkudziesięciu iteracjach mam error canvas does not allow drawing lub program wykona kilka dziesiąt iteracji i zachowuje się tak jakby nastąpiło zakleszczenie - Formy ani przesunąć, stoi na jednej iteracji w metodzie PrintScreen. W jaki sposób można to poprawić? Dodam że używam wątków WinApi a nie tych od Borlanda z klasy TThread.
Pozdrawiam.