AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread's & Signals?

Ein Thema von Mavarik · begonnen am 14. Mai 2013 · letzter Beitrag vom 27. Jun 2013
Antwort Antwort
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.166 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Thread's & Signals?

  Alt 20. Mai 2013, 22:59
...und lößt eine manuelle Exception aus!
... Was ist denn eine 'manuelle Exception'?
Delphi-Quellcode:
procedure SignalConverter(ExceptionEIP: LongWord; FaultAddr: LongWord; ErrorCode: LongWord);
{$IFDEF CPUARM}
begin
  raise GetExceptionObject(ExceptionEIP, FaultAddr, ErrorCode) at Pointer(ExceptionEIP);
end;
{$ENDIF CPUARM}
{
RaiseSignalException is called from SignalConverter, once we've made things look
like there's a legitimate stack frame above us. Now we will just create
an exception object, and raise it via a software raise.
}
procedure RaiseSignalException(ExceptionEIP: LongWord; FaultAddr: LongWord; ErrorCode: LongWord);
begin
raise GetExceptionObject(ExceptionEIP, FaultAddr, ErrorCode);
end;

{
SignalConverter is where we come when a signal is raised that we want to convert
to an exception. This function stands the best chance of being called with a
useable stack frame behind it for the purpose of stack unwinding. We can't
guarantee that, though. The stack was modified by the baseline signal handler
to make it look as though we were called by the faulting instruction. That way
the unwinder stands a chance of being able to clean things up.
}

Delphi-Quellcode:
var
  E : TEvent;
begin
  E.SetEvent;
  // call dispatch_semaphore_signal(FEvent);
Mavarik
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

AW: Thread's & Signals?

  Alt 21. Mai 2013, 06:17
Das Create vom TEvent hast du aber drin oder hast den quelltext extrem gekürzt ?
Lars
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.166 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Thread's & Signals?

  Alt 23. Mai 2013, 12:28
Das Create vom TEvent hast du aber drin oder hast den quelltext extrem gekürzt ?
Ja sorry... Ging mir nur um die Aufrufreihenfolge...

Im Simulator funktioniert es ja auch....

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.166 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Thread's & Signals?

  Alt 26. Jun 2013, 18:05
OK... Es geht doch...

Der Compiler akzeptiert zwar

Delphi-Quellcode:
var
  E : TEvent;
begin
  E := TEvent.Create;
  E.ResetEvent;
...
end;
Aber es funktioniert nur mit:

Delphi-Quellcode:
var
  E : TEvent;
begin
  E := TEvent.Create(NIL,true,true,''); // <---
  E.ResetEvent;
...
end;
Das war der Trick!

Grüsse Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Thread's & Signals?

  Alt 27. Jun 2013, 06:53
Ich persönlich finde es ja schicker, wenn der Event sich selbst zurücksetzt.

Dann reicht
Delphi-Quellcode:
var
  E : TEvent;
begin
  E := TEvent.Create( nil, False, False, '' );
  while not Terminated do
  begin
    E.WaitFor;
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.166 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Thread's & Signals?

  Alt 27. Jun 2013, 13:15
Ich persönlich finde es ja schicker, wenn der Event sich selbst zurücksetzt.
Ist glaube ich Geschmacksache.

Ich mache es lieber so...

Delphi-Quellcode:
  while GetAdresse and not Terminated do
    begin
      E.ResetEvent;

      Akt := GetTickCount;
      Waiter := Akt - LastTick;
      LastTick := Akt;

      if Waiter < 1000 then
        Sleep(1000-Waiter);

      FGeocoder.Geocode(Address); // 1x pro Sekunde

      R := E.WaitFor(15000);
      case R of
        wrSignaled : begin
                           Synchronize(Process);
                           if fAbort then
                             begin
                               Error := -8;
                               break;
                             end;
                         end;
        wrTimeout : begin
                           Error := -4;
                           break;
                         end;
        wrAbandoned : begin
                           Error := -5;
                           break;
                         end;
        wrError : begin
                           Error := -6;
                           break;
                         end;
        wrIOCompletion : begin
                           Error := -7;
                           break;
                         end;
      end;
    end;
Mavarik
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz