AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Wie stelle ich sicher dass ich nichts von VCL verwende
Thema durchsuchen
Ansicht
Themen-Optionen

Wie stelle ich sicher dass ich nichts von VCL verwende

Ein Thema von Viktorii · begonnen am 31. Okt 2008 · letzter Beitrag vom 5. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#1

Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 07:04
Hallo.

Ich bin mir da bei einer Sache schon seit langem unsicher. Ich weiß, dass ich in einem Thread die VCL nicht verwenden darf. Ich weiß aber nicht genau was jetzt zur VCL gehört.

Wie es mir scheint ist in diesem Fall die Unit Forms := pfui.

Ist Forms die einzige Unit die zur VCL gehört? Wenn ich diese also nicht benutze bin ich auf der sichern Seite bzw.andere Units darf ich verwenden wie ExtCtrls, SysUtils?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 07:13
Also wenn "Ctrls" drin vorkommt, sieht es auch böse aus.
VCL steht für VISUAL Component Library. Du musst dir nicht merken, welche Units verboten sind, sondern einfach nur, dass du im Thread keine Bildschirmausgaben generierst.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#3

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 07:30
Hmmm... Verstehe dass noch nicht so ganz... dass das V für Visuall steht weiss ich ja
aber wie ist es zB. mit Application.ProcessMessages? Hat ja nicht direkt was mit der Bildschirmausgabe zu tun. Aber in einem Thread sollte man das auch nicht verwenden, oder?
Und wie ist das zB. mit TTimer? Der kommt ja aus ExtCtrls, macht aber auch keine Bildschirmausgabe. Darf ich den nun verwenden oder nicht? usw.
Irgendwie blicke ich dass nicht was ich warum verwenden darf und was nicht
Deswegen dachte ich, wenn ich einfach die und die Units nicht verwende, dann ist alles okay. Ist aber natürlich auch blöd wenn ich Units nicht verwenden würde, die nur teilweise 'bösen' Inhalt haben. Dann könnte ich den 'guten' Inhalt dieser Unit ja auch nicht verwenden...
Wie Du siehtst: Ich bin verwirrt
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 07:33
Do sollst einfach nichts auf den Bildschirm malen, also Label, Buttons, Listboxen etc. in Threads verwenden.

Meiner Ansicht nach ist es ein Designfehler, wenn ich in einem Thread mit 'Application.ProcessMessages' arbeiten muss.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von hazard999
hazard999

Registriert seit: 2. Okt 2008
38 Beiträge
 
#5

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 07:45
Application.ProcessMessages sollte auf den Thread sowieso keine Auswirkung haben.

IMHO sollte der Thread eine eigene MessageLoop haben, ProcessMessages arbeitet nur die Loop des Mainthreads ab.

Delphi-Quellcode:
   
   PeekMessage(MsgRec, 0, 0, 0, PM_NOREMOVE);
   bWorking := false;
   if Terminated then
      bWorking := true;
   while not Terminated do
   begin
      if not bWorking then
      begin
         GetMessage(MsgRec, 0, 0, 0);
         while PeekMessage(MsgRec, 0, 0, 0, PM_REMOVE) do
         begin
            TranslateMessage(MsgRec);
            DispatchMessage(MsgRec);
         end;
      end
      else
         bWorking := false;
    end;
Dieser Code erstellt im Thread eine Message-Loop.
GetMessage wartet auf die nächste Nachricht.
Mit Translate und Dispatch den Inhalt der Loop lesen.

QED => Application.ProcessMessages bewirkt im Thread nix, ausser das du vielleicht eine fürchterliche Race-Condition heraufbeschwörst wenn im MainThread Application.ProcessMessages verwendet wird
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 07:47
GetMEssage und Peekmessage kurz hintereinander? Da gehen dir abher ein paar MEssages verloren.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#7

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 08:19
Der Grund warum ich Application.ProcessMessages ist folgender: Ich habe eine DLL geschrieben, welche von anderen Programmieren benutzt werden soll. Die Funktionen sollen auch in einem Thread aufrufbar sein. Dazu habe ich hier schon mal gepostet.

Nun wird eine Funktion dazu verwendet einen DSP per USB zu pollen. Ist unschön, aber lässt sich durch den Anwendungsfall nicht ändern. Nun kann es sein, dass der DSP (aus welchen Gründen auch immer) rebootet. Das heißt er ist nach einigen Sekunden wieder da. Wenn dies passiert, muss ich in der Funktion solange warten (ich darf nicht vorher aus der Funktion zurückkehren) bis er wieder da ist. Dazu habe ich mir ein 'Notifyer Objekt' gemacht. Ich reagiere auf die entsprechenden WM, prüfe dann auf VendorID usw. Nun möchte den Notifyer alle 100 ms abfragen ob sich was getan hat. Ich habe also erst sleep(100) gemacht und dann nachgeschaut. Das funktioniert allerdins nicht. Sleep scheint wohl die ganze Anwendung komplett lahm legt und somit hat mein Notifyer die WM wohl nicht mitbekommen. Dann habe ich mir als Alternative zu sleep diese Lösung überlegt:

Delphi-Quellcode:
        Sleeper := 0;
        while Sleeper < 100 do
        begin
          Sleep(1);
          inc(Sleeper);
          Application.ProcessMessages;
        end;
So funktioniert es zwar, aber wenn die Funktion in einem Thread aufgerufen wird, wird somit ja auch Application.ProcessMessages in einem Thread aufgerufen. Kann ich denn irgendwie dafür sorgen dass die mein Notifyer mit einer anderen Lösung als der oben Genannten weiterarbeiten kann?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 08:23
Wieso brauchts du Application.ProcessMessages in einem Thread? Hast du mal in der Hilfe nachgeguckt, was diese Methode überhaupt macht? Sie sorgt dafür, dass dein Fenster die Nachrichtenschlange abarbeitet und so noch auf eingaben reagiert. Da ein Thread aber sowieso von deinem Hauptthread mit dem Fenster entkoppelt ist, ist der Aufruf von Application.ProcessMessages unsinnig.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#9

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 08:42
Ja, ich habe da schon mal nachgelesen:

Da der Notifyer nicht mehr funktioniert hat, bin ich davon ausgegangen dass die WM noch in der Nachrichtenschlange hängt und nicht abgearbeitet wird. Deswegen dache ich, ich kann das so umgehen:
Zitat:
Unterbricht die Ausführung einer Anwendung, so dass die Botschaftswarteschlange verarbeitet werden kann.

Beschreibung
Durch einen Aufruf von ProcessMessages ermöglichen Sie der Anwendung, die Botschaften in der Warteschlange abzuarbeiten. ProcessMessages durchläuft die Windows-Botschaftswarteschlange so lange, bis diese leer ist, und gibt die Steuerung dann wieder an die Anwendung zurück.

Dass sich das jetzt nur auf Eingaben bezieht, wird für mich aus der Hilfe nicht ersichtlich

Bezieht sich dass nicht auch auf WM?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 08:51
Alle Windowsnachrichten, die mit WM_... anfangen sind Fensternachrichten, das heißt, sie werden an Fenster gesendet. Hat dein Thread ein Fenster und eine Nachrichtenschleife?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz