Problème de CallFunctionFast & Thread (..encore et encor
Problème de CallFunctionFast & Thread (..encore et encor
Bonsoir à tous !
Je n'ai jamais fait de programme threadé auparavant, et je m'y suis mis, mais j'ai quelques soucis !
J'ai essayé de faire ça comme thread (en gros) :
Procedure ThreadP(Valeur)
repeat
delay(2000)
CallFunctionFast(*com_write, temp)
forever
EndProcedure
Mais le CallFunctionFast ne fait pas ce qu'il doit faire. Le programme semble totalement ignorer l'instruction. Pourtant si je décharge la lib alors que le thread tourne toujours, il bug quand-même ..!) Et sans le thread, ma fonction marche superbement bien.
En fait, même les CallFunctionFast qui ne sont pas éxécutées depuis le thread ne fonctionnent plus lorsque j'active le thread.
(Evidemment le CallFunctionFast est très lent pour mon cas(écriture sur le port série et parallèle) et doit être appelé très souvent, voilà pourquoi j'ai fait un thread)
Ce n'est pas possible de faire un appel de fonction externe depuis un thread ?!?
Merci beaucoup pour votre aide,
Flavien
Je n'ai jamais fait de programme threadé auparavant, et je m'y suis mis, mais j'ai quelques soucis !
J'ai essayé de faire ça comme thread (en gros) :
Procedure ThreadP(Valeur)
repeat
delay(2000)
CallFunctionFast(*com_write, temp)
forever
EndProcedure
Mais le CallFunctionFast ne fait pas ce qu'il doit faire. Le programme semble totalement ignorer l'instruction. Pourtant si je décharge la lib alors que le thread tourne toujours, il bug quand-même ..!) Et sans le thread, ma fonction marche superbement bien.
En fait, même les CallFunctionFast qui ne sont pas éxécutées depuis le thread ne fonctionnent plus lorsque j'active le thread.
(Evidemment le CallFunctionFast est très lent pour mon cas(écriture sur le port série et parallèle) et doit être appelé très souvent, voilà pourquoi j'ai fait un thread)
Ce n'est pas possible de faire un appel de fonction externe depuis un thread ?!?
Merci beaucoup pour votre aide,
Flavien
Je viens de tester ton cas :
Pas de problème.
Code : Tout sélectionner
Global hThread.l, kill_thread.l
Global cnt.l
Procedure Foo()
cnt + 1
Debug cnt
EndProcedure
Procedure ThreadP(Value.l)
Repeat
If kill_thread = 1
Break
EndIf
Delay(1000)
CallFunctionFast(@Foo())
ForEver
EndProcedure
kill_thread = 0
hThread = CreateThread(@ThreadP(), 0)
If OpenWindow(0, 0, 0, 230, 90, "Blah", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
kill_thread = 1
EndIf
"Qui baise trop bouffe un poil." P. Desproges
Bizarre, ton code marche très bien chez moi, mais celui-ci pas
Il a besoin de la dll Port.dll (disponible ici :
http://www.dll-files-download.com/P/200 ... 11969.html )
et il envoie des données sur le port série. Chez moi là il ne marche pas,
mais si je mets
alors je reçois effectivement mes données.. qu'en pensez-vous ?
[/code]
Il a besoin de la dll Port.dll (disponible ici :
http://www.dll-files-download.com/P/200 ... 11969.html )
et il envoie des données sur le port série. Chez moi là il ne marche pas,
mais si je mets
Code : Tout sélectionner
;hThread = CreateThread(@ThreadP(), 0)
ThreadP(0)
Code : Tout sélectionner
Global hThread.l, kill_thread.l
Global *com_write
Global *com_open
Procedure Init()
OpenLibrary(1, "PORT.DLL")
*com_open = GetFunction(1,"OPENCOM")
*com_write = GetFunction(1,"SENDBYTE")
texte$ = "COM1: baud=1200 data=8 parity=N stop=1"
Ouvrir = CallFunctionFast(*com_open, texte$)
EndProcedure
Procedure ThreadP(Value.l)
Repeat
Delay(1000)
CallFunctionFast(*com_write, 100) ;Envoie l'octet 100 sur le port série
ForEver
EndProcedure
kill_thread = 0
Init()
hThread = CreateThread(@ThreadP(), 0)
;ThreadP(0)
If OpenWindow(0, 0, 0, 230, 90, "Blah", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
kill_thread = 1
EndIf
Ton code fonctionne bien chez moi, en tout cas, ça ne plante pas.
Bon, le port série est désactivé dans le bios (je peut pas reboot la) mais je récupère bien l'adresse de la fonction donc elle est appelée, pas de plantage.
J'ai pris la DLL ici (ton lien ne fonctionne pas)
Je serais toi, j'utiliserais les fonctions natives de PB, elles sont portable qui plus est
Bon, le port série est désactivé dans le bios (je peut pas reboot la) mais je récupère bien l'adresse de la fonction donc elle est appelée, pas de plantage.
J'ai pris la DLL ici (ton lien ne fonctionne pas)
Je serais toi, j'utiliserais les fonctions natives de PB, elles sont portable qui plus est

"Qui baise trop bouffe un poil." P. Desproges
Ah désolé pour le lien
Chez moi aussi, il ne bug pas, mais les données ne sont pas envoyées.
J'utilise un microcontroleur et celui-ci ne reçoit pas de données quand le thread est activé.
J'en ai donc déduit que la fonction ne s'éxécutait pas. Mais effectivement, si elle renvoie une valeur c'est sûrment un problème avec la fonction.. Je ne connais pas assez pour dire. Je pensais que c'était un tout petit problème venant de moi en fait.
Hehe j'aimerais bien mais y-a-t'il des fonctions PB qui gèrent le port série ? J'ai pas vu dans l'aide en tout cas.
Mais ç'est pas grave; pour faire mon thread, j'ai créé deux éxécutables, que je fais communiquer par winsock..je sais, j'ai honte
mais ça marche super bien.
Je vous remercie beaucoup pour vos réponses en tout cas !
Flavien
Chez moi aussi, il ne bug pas, mais les données ne sont pas envoyées.
J'utilise un microcontroleur et celui-ci ne reçoit pas de données quand le thread est activé.
J'en ai donc déduit que la fonction ne s'éxécutait pas. Mais effectivement, si elle renvoie une valeur c'est sûrment un problème avec la fonction.. Je ne connais pas assez pour dire. Je pensais que c'était un tout petit problème venant de moi en fait.
Hehe j'aimerais bien mais y-a-t'il des fonctions PB qui gèrent le port série ? J'ai pas vu dans l'aide en tout cas.
Mais ç'est pas grave; pour faire mon thread, j'ai créé deux éxécutables, que je fais communiquer par winsock..je sais, j'ai honte

Je vous remercie beaucoup pour vos réponses en tout cas !
Flavien