Seite 2 von 2

Verfasst: 27.09.2007 16:15
von jpd
Hi,
habe das jetzt so gelöst!

Code: Alles auswählen

Global sec.l=5
Procedure test1()
Debug 1
EndProcedure
Procedure test2()
Debug 2
EndProcedure
Procedure test3()
Debug 3
EndProcedure
Procedure Start(proc.l)
  
  Repeat
    If proc=1:   test1():   EndIf
    If proc=2:  test2(): EndIf 
    If proc=3:  test3():EndIf
    Datum.s=FormatDate("%dd/%mm/%yyyy "+ "%hh:%ii:%ss ", Date())
    Debug Datum
    ;100000
    Sleep_(sec*1000)
  ForEver
  
  EndProcedure
  
  CreateThread(@start(),1)
  CreateThread(@start(),2)
  CreateThread(@start(),3)
  
  Repeat
  ;hier ist eigentlich meine event schleife...
  ForEver 
@#NULL
bissher habe ich mich nie an macro dran gemacht...
werde mir irgendwann auch damit beschäftigen.

Ciao
jpd

Verfasst: 27.09.2007 16:32
von NicTheQuick
Ich würde es so machen:

Code: Alles auswählen

Prototype.l Proc()

Global sec.l = 5
Procedure test1()
  Debug 1
EndProcedure
Procedure test2()
  Debug 2
EndProcedure
Procedure test3()
  Debug 3
EndProcedure
Procedure Start(*proc.Proc)
  
  Repeat
    *proc()
    Datum.s = FormatDate("%dd/%mm/%yyyy "+ "%hh:%ii:%ss ", Date())
    Debug Datum
    ;100000
    Sleep_(sec * 1000)
  ForEver
  
EndProcedure
 
CreateThread(@Start(), @test1())
CreateThread(@Start(), @test2())
CreateThread(@Start(), @test3())
 
Repeat
  ;hier ist eigentlich meine event schleife...
ForEver 

Verfasst: 27.09.2007 16:52
von jpd
ja,

das ist so ziemlich nah an das was ich mir vorgestellt habe. :allright:

was mich wunschlos glücklich machen würde ist:

"sec"

für jeden thread anders zu setzen.

Danke!

jpd

Verfasst: 27.09.2007 17:38
von NicTheQuick
Nichts leichter als das. :mrgreen:

Code: Alles auswählen

Prototype.l Proc()
Structure StartT
  sec.l
  proc.Proc
  Thread.l
EndStructure
Global NewList StartT.StartT()

Procedure test1()
  Debug 1
EndProcedure
Procedure test2()
  Debug 2
EndProcedure
Procedure test3()
  Debug 3
EndProcedure
Procedure Start(*StartT.StartT)
 
  Repeat
    *StartT\Proc()
    Datum.s = FormatDate("%dd/%mm/%yyyy "+ "%hh:%ii:%ss ", Date())
    Debug Datum
    Sleep_(*StartT\sec * 1000)
  ForEver
 
EndProcedure

Procedure CreateStart(*proc.Proc, sec.l)
  If AddElement(StartT())
    StartT()\sec = sec
    StartT()\proc = *proc
    StartT()\Thread = CreateThread(@Start(), @StartT())
    
    ProcedureReturn StartT()\Thread
  EndIf
  
  ProcedureReturn #False
EndProcedure

CreateStart(@test1(), 2)
CreateStart(@test2(), 3)
CreateStart(@test3(), 5)

Repeat
  ;hier ist eigentlich meine event schleife...
Until GetAsyncKeyState_(#VK_ESCAPE)

Verfasst: 27.09.2007 17:48
von jpd
:shock: ,

um das zu bearbeiten muss ich aber frish sein! :freak:

jpd

Verfasst: 27.09.2007 18:55
von hardfalcon
Zaphod hat geschrieben:Genau. Du musst bedenken, dass der Quellcode nach dem Compilieren nicht mehr da ist, die CPU also unmöglich wissen kann, wie welche Prozedur in deinem Quelltext hieß.
Warum kann man dann bei einer DLL nach ner Funktion mit nem bestimmten Namen suchen? DLLs sind doch auch im PE-Format... :?

Verfasst: 27.09.2007 18:59
von Kaeru Gaman
du kannst aber nur nach welchen suchen, die mit ProcedureDLL deklariert sind...

Verfasst: 27.09.2007 23:55
von jpd
Hi NicTheQuick,

funktioniert wie ne eins :)

habe das in meinen tool implementiert und ist einfach genial! :allright:

Danke
jpd

Verfasst: 28.09.2007 01:31
von Zaphod
Exakt... DLLs haben sozusagen eine Tabelle für die Prozeduren, die die Schnittstelle zur DLL darstellen sollen. Der restliche Quelltext der Prozeduren ist aber nicht mehr da. Irgendwie kann man sowas glaube ich auch für Executables machen, aber da ist das mit dem Aufruf natürlich anders als bei reinen DLLs.