Autor Beitrag
maheca
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 26.03.11 18:08 
Hallo zusammen!

Ich probiere jetzt schon einige Zeit herum und bin auch ungefähr genauso lang am googeln, leider ohne Erfolg :(
Folgendes Problem: Ich möchte vom PC aus einige Lichteffekte (Blitzer, LED-Fluter etc) steuern. Das ganze funktioniert auch ganz gut, allerdings möchte ich das, was mit den Geräten passiert, auch auf dem Computer darstellen. Dazu habe ich eine sehr einfache Ansicht aus TShapes erstellt, denen ich dann z.B. eine Farbe zuweise. Funktioniert auch super. Problematisch wird es allerdings bei allen Geräten, die blitzen können: Eigentlich sollte das Blitzen von einem Timer aus gesteuert werden, aber leider sind die Blitze mal zu sehen und mal nicht...

Folgender Code im Timer:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TDMXDevMon.LED2Strobe(Sender: TObject);
var
  OutputBuffer: TDMXArray;
  i: Integer;

begin
  OutputBuffer := DMXConnection.getDMX_Out;
  for i := 1 to 8 do begin
    TShape(LED2.Items[i-1]).Brush.Color :=
      round(OutputBuffer[Ch_LED2]/250 * OutputBuffer[(i-1)*3+Ch_LED2+2])   * $00000001 +
      round(OutputBuffer[Ch_LED2]/250 * OutputBuffer[(i-1)*3+1+Ch_LED2+2]) * $00000100 +
      round(OutputBuffer[Ch_LED2]/250 * OutputBuffer[(i-1)*3+2+Ch_LED2+2]) * $00010000;
  end;
  for i := 1 to 15 do begin
    Application.ProcessMessages;
    Sleep(2);   
  end;
  for i := 1 to 8 do begin
    TShape(LED2.Items[i-1]).Brush.Color := $00000000;
  end;
end;


Je früher die einzelnen Shapes erzeugt wurden, desto schlechter werden sie aktualisiert, sprich desto mehr Blitze werden "verschluckt". Ich habe es auch schon mit Invalidate, Repaint, Refresh, Kombinationen von allem versucht --> nichts wird besser. Ich bin echt verzweifelt, das kann doch nicht so schwer sein...
Hat irgendjemand einen Vorschlag, wie ich das ganze verbessern könnte? Bin für jede Hilfe dankbar!
maheca Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 27.03.11 20:49 
Hat denn wirklich niemand eine Idee?
(entschuldigt den Doppelpost, aber es ist dringend...)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 27.03.11 21:02 
Hallo und :welcome: im Forum!

Versuche es mit Delay statt Sleep, denn das Problem ist bei Sleep, dass du die Oberfläche einfrierst.
www.delphipraxis.net/6620-delay.html

Ja, das Problem warum niemand geantwortet hat könnte sein, dass es ohne Beispiel schlecht nachzuvollziehen ist. ;-)
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: So 27.03.11 21:04 
Hast du mal die Sleep-Time verlängert und geguckt ob er immernoch Aussetzer macht?
Vlt nimmt das Auge ja nicht soviele Blitze auf einmal wahr.

Lg
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 27.03.11 21:14 
Versuche mal dieses:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
OutputBuffer := DMXConnection.getDMX_Out;
for i := 1 to 8 do
begin
    TShape(LED2.Items[i-1]).Brush.Color:= round(OutputBuffer[Ch_LED2]/250 * OutputBuffer[(i-1)*3+Ch_LED2+2])* $00000001 + 
                                       round(OutputBuffer[Ch_LED2]/250 * OutputBuffer[(i-1)*3+1+Ch_LED2+2]) * $00000100 +
                                       round(OutputBuffer[Ch_LED2]/250 * OutputBuffer[(i-1)*3+2+Ch_LED2+2]) * $00010000;
    Application.ProcessMessages;
    sleep(2); //<--oder delay
    TShape(LED2.Items[i-1]).Brush.Color := $00000000;
end


Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!