🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi
6 messages
6 total messages Started by stchebel Mon, 07 May 2018 13:08
Scrollowanie bitmapy - c.d.
#346591
Author: stchebel
Date: Mon, 07 May 2018 13:08
2 lines
1900 bytes
Witam,
 W zasadzie jest to kontynuacja wątku sprzed paru dni. Scrollbox działa prawie tak jak bym sobie tego życzył. To co robię, to taki jakby oscyloskop. Zbieram dane, a następnie rysuję wykres czasowy.Odbywa się to w czasie rzeczywistym. Działa fajnie, ale jak przesuwam Scrollbarem w lewo/prawo, to odświeżanie bitmapy "zastyga" i tak długo jak mam wciśnięty lewy klawisz myszy, mogę przeglądać  wyniki poprzedniej akwizycji danych. Dopiero jak puszczę lewy klawisz, to odświeżanie bitmapy ponownie rusza. Da się temu jakoś zaradzić?
Re: Scrollowanie bitmapy - c.d.
#346592
Author: danielmarcinmazur
Date: Tue, 08 May 2018 07:28
1 lines
1417 bytes
W jakim evencie rysujesz na canvasie?
Re: Scrollowanie bitmapy - c.d.
#346593
Author: stchebel
Date: Tue, 08 May 2018 09:23
48 lines
3033 bytes
W dniu wtorek, 8 maja 2018 09:28:17 UTC+2 użytkownik danielma...@gmail.com napisał:
> W jakim evencie rysujesz na canvasie?

ButtonxClick. Kod wygląda tak:

procedure TForm1.Button10Click(Sender: TObject);
var
k,ftresult,Write_Result,Read_Result,Marker:integer;
EchoL,Wynik:TablicaEcho;
Found:boolean;
begin
CT_START:=not CT_START;
if CT_START then begin
 Button10.Caption:='CT_STOP';
// UstawBit(Port_8,3);
 end;
 if (not CT_START) then begin
 Button10.Caption:='CT_START';
// ZerujBit(Port_8,3);
 end;
//ZapiszPort(8,Port_8);

repeat
UstawBit(Port_8,3);
ZapiszPort(8,Port_8);
ZerujBit(Port_8,3);
ZapiszPort(8,Port_8);



// Prezentacja 1D

k:=16384;
ftresult:=FT_Read(FT_HANDLE,@EchoL,k,@Read_Result);
ZnajdzMarker(EchoL,Marker,Found);
if Found then Label27.Caption:=IntToStr(Marker) else Label27.Caption:='Not Found';
RysujPrzebieg(ObrazGorny,Marker,8000,EchoL,Wykres);
Image6.Canvas.Draw(0,0,Wykres);

Application.ProcessMessages;
until (not CT_START);
end;

Po kliknięciu guzika Button10 zmienna globalna CT_START zmienia wartość na true i wszystko zaczyna się kręcić w pętli repeat... until. W procedurze RysujPrzebieg zmienna ObrazGorny to bitmapa z "siatką" ekranu oscyloskopu, EchoL to tablica danych do namalowania, a wykres to gotowa bitmapa do wyświetlania.

Procedury UstawBit, ZerujBit, ZapiszPort służą do wyzwalania akwizycji. Ot, taki trigger. FT_Read służy do odczytu danych z urządzenia zewnętrznego.

Kolejne kliknięcie na ten guzik powoduje zmianę zmiennej CT_START na false i pętla przestaje się kręcić.
Re: Scrollowanie bitmapy - c.d.
#346594
Author: J-23
Date: Tue, 08 May 2018 14:13
59 lines
3280 bytes
W dniu 08.05.2018 o 11:23, stchebel@gmail.com pisze:
> W dniu wtorek, 8 maja 2018 09:28:17 UTC+2 użytkownik danielma...@gmail.com napisał:
>> W jakim evencie rysujesz na canvasie?
> 
> ButtonxClick. Kod wygląda tak:
> 
> procedure TForm1.Button10Click(Sender: TObject);
> var
> k,ftresult,Write_Result,Read_Result,Marker:integer;
> EchoL,Wynik:TablicaEcho;
> Found:boolean;
> begin
> CT_START:=not CT_START;
> if CT_START then begin
>   Button10.Caption:='CT_STOP';
> // UstawBit(Port_8,3);
>   end;
>   if (not CT_START) then begin
>   Button10.Caption:='CT_START';
> // ZerujBit(Port_8,3);
>   end;
> //ZapiszPort(8,Port_8);
> 
> repeat
> UstawBit(Port_8,3);
> ZapiszPort(8,Port_8);
> ZerujBit(Port_8,3);
> ZapiszPort(8,Port_8);
> 
> 
> 
> // Prezentacja 1D
> 
> k:=16384;
> ftresult:=FT_Read(FT_HANDLE,@EchoL,k,@Read_Result);
> ZnajdzMarker(EchoL,Marker,Found);
> if Found then Label27.Caption:=IntToStr(Marker) else Label27.Caption:='Not Found';
> RysujPrzebieg(ObrazGorny,Marker,8000,EchoL,Wykres);
> Image6.Canvas.Draw(0,0,Wykres);
> 
> Application.ProcessMessages;
> until (not CT_START);
> end;
> 
> Po kliknięciu guzika Button10 zmienna globalna CT_START zmienia wartość na true i wszystko zaczyna się kręcić w pętli repeat... until. W procedurze RysujPrzebieg zmienna ObrazGorny to bitmapa z "siatką" ekranu oscyloskopu, EchoL to tablica danych do namalowania, a wykres to gotowa bitmapa do wyświetlania.
> 
> Procedury UstawBit, ZerujBit, ZapiszPort służą do wyzwalania akwizycji. Ot, taki trigger. FT_Read służy do odczytu danych z urządzenia zewnętrznego.
> 
> Kolejne kliknięcie na ten guzik powoduje zmianę zmiennej CT_START na false i pętla przestaje się kręcić.
> 

Ja bym to podzielił na wątki, bo tak jak masz teraz to robisz wszystko w 
wątku głównym i dlatego staje to dęba przy przesuwaniu.

Będziesz miał trochę pracy z odpowiednią synchronizacją ale to jest do 
ogarnięcia

Pozdrawiam
J-23
Re: Scrollowanie bitmapy - c.d.
#346595
Author: stchebel
Date: Wed, 09 May 2018 00:30
62 lines
4025 bytes
W dniu wtorek, 8 maja 2018 16:13:57 UTC+2 użytkownik J-23 napisał:
> W dniu 08.05.2018 o 11:23, stchebel@gmail.com pisze:
> > W dniu wtorek, 8 maja 2018 09:28:17 UTC+2 użytkownik danielma...@gmail.com napisał:
> >> W jakim evencie rysujesz na canvasie?
> > 
> > ButtonxClick. Kod wygląda tak:
> > 
> > procedure TForm1.Button10Click(Sender: TObject);
> > var
> > k,ftresult,Write_Result,Read_Result,Marker:integer;
> > EchoL,Wynik:TablicaEcho;
> > Found:boolean;
> > begin
> > CT_START:=not CT_START;
> > if CT_START then begin
> >   Button10.Caption:='CT_STOP';
> > // UstawBit(Port_8,3);
> >   end;
> >   if (not CT_START) then begin
> >   Button10.Caption:='CT_START';
> > // ZerujBit(Port_8,3);
> >   end;
> > //ZapiszPort(8,Port_8);
> > 
> > repeat
> > UstawBit(Port_8,3);
> > ZapiszPort(8,Port_8);
> > ZerujBit(Port_8,3);
> > ZapiszPort(8,Port_8);
> > 
> > 
> > 
> > // Prezentacja 1D
> > 
> > k:=16384;
> > ftresult:=FT_Read(FT_HANDLE,@EchoL,k,@Read_Result);
> > ZnajdzMarker(EchoL,Marker,Found);
> > if Found then Label27.Caption:=IntToStr(Marker) else Label27.Caption:='Not Found';
> > RysujPrzebieg(ObrazGorny,Marker,8000,EchoL,Wykres);
> > Image6.Canvas.Draw(0,0,Wykres);
> > 
> > Application.ProcessMessages;
> > until (not CT_START);
> > end;
> > 
> > Po kliknięciu guzika Button10 zmienna globalna CT_START zmienia wartość na true i wszystko zaczyna się kręcić w pętli repeat... until. W procedurze RysujPrzebieg zmienna ObrazGorny to bitmapa z "siatką" ekranu oscyloskopu, EchoL to tablica danych do namalowania, a wykres to gotowa bitmapa do wyświetlania.
> > 
> > Procedury UstawBit, ZerujBit, ZapiszPort służą do wyzwalania akwizycji. Ot, taki trigger. FT_Read służy do odczytu danych z urządzenia zewnętrznego.
> > 
> > Kolejne kliknięcie na ten guzik powoduje zmianę zmiennej CT_START na false i pętla przestaje się kręcić.
> > 
> 
> Ja bym to podzielił na wątki, bo tak jak masz teraz to robisz wszystko w 
> wątku głównym i dlatego staje to dęba przy przesuwaniu.
> 
> Będziesz miał trochę pracy z odpowiednią synchronizacją ale to jest do 
> ogarnięcia
> 
> Pozdrawiam
> J-23

Też tak podejrzewałem. Problem w tym, że nigdy nie pisałem programów wielowątkowych. Programuję w zasadzie w sytuacjach wyjątkowych, więc marny ze mnie programista. Jak na razie mam pilniejsze tematy związane z przetwarzaniem sygnału, więc ten temat zostawiam na deser bo nie jest to sprawa krytyczna. Nie mniej jednak, dzięki za podpowiedź.
Re: Scrollowanie bitmapy - c.d.
#346596
Author: mmm
Date: Thu, 10 May 2018 06:34
10 lines
1737 bytes
> Też tak podejrzewałem. Problem w tym, że nigdy nie pisałem programów wielowątkowych. Programuję w zasadzie w sytuacjach wyjątkowych, więc marny ze mnie programista. Jak na razie mam pilniejsze tematy związane z przetwarzaniem sygnału, więc ten temat zostawiam na deser bo nie jest to sprawa krytyczna. Nie mniej jednak, dzięki za podpowiedź.
> 
Jak nie musiałeś używać wątków to tylko się cieszyć, zawsze możesz 
zaakceptować drobne niedociągnięcia swojej aplikacji ;)
Wielowątkowość rozwiązuje problemy ale też dodaje nowe tematy do walki 
np. wspomniana synchronizacja.

Przyjemnej nauki życzę.

M
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads