|
Dernière réponse | |
---|---|
Sujet : [Borland C++ builder] Redirection sdtout | |
Bruce | un cht'i up car bon... je suis tj bloqué... |
Aperçu |
---|
Vue Rapide de la discussion |
---|
Bruce | un cht'i up car bon... je suis tj bloqué... |
JWhy | oui... je vois pas pourquoi vous lui parlez de threads ...
comme je te disais, le probleme vient de ReadFile qui est bloquant tant que rien n'est ecrit dans ton stdout... c'est a dire que si tu as un prog qui va ecrire un truc, attendre 5 secondes, ecrire un autre truc, readfile va bloquer ton appli pendant les 5 secondes ou le prog. n'ecrit rien dans le stdout... il faut que tu remplaces le ReadFile bloquant:
|
Bruce | Honettement je suis un peu paumé, je vois pas trop ou vous voulez en venir (il faut dire que jes thread et moi... :)). |
robripper | Tu crées juste un thread, tu lui passes ta fonction en param (cell qui va faire tout le travail)... etc
En plus ici t'es pas obligé de section critique donc ... DWORD WINAPI ma_fonction(LPVOID) { // ... rippage, normalisation, etc etc ... :sol: return 0; } |
antp |
|
robripper | Franchement moi j'utiliserais l'API c'est bien plus simple, je viens de jetter un oeil dans c++ builder :D Attention, bientôt il va te faire utiliser Delphi, je connais bien antp :hap: :hap: |
antp |
|
robripper | Tu peux aussi modifier les priorités ...
SetThreadPriority(threadhandle,THREAD_PRIORITY_NORMAL); |
Bruce | Hu ? :??: |
antp |
[edit]--Message édité par antp--[/edit] |
robripper |
|
Bruce | Hummm... disons que je m'y connais mal ;) |
antp | pourquoi en win32 ? y a des objets pour faire des threads dans C++builder, c'est plus simple à utiliser je crois. |
Bruce | Heu... en Win32 j'ai du mal, un exemple de code ??? |
robripper |
|
antp | ou alors:
while(!WaitForSingleObject(pi.hProcess, 1000)) { Application->ProcessMessages(); } toutes les secondes il fait le processmessages. je sais pas si c'est très bien comme solution. et si le programme exécuté est calé il attend indéfiniment. |
antp | ha ouais c'est au WaitForSingleObject(pi.hProcess, 90000); qu'il bloque... j'avais pas vu.
le plus simple serait alors de le mettre dans un thread séparé je crois. |
JWhy | m'etonnerait que ca marche... c'est l'appel de l'API qui est bloquant... le ProcessMessage ne resoudra rien, je pense ...
sinon, regarde l'aide de l'API PeekNamedPipe, la declaration en C + le code Delphi devrait pouvoir t'aider a faire la conversion . |
antp | si tu le met juste après le ->add il risque de pas le faire souvent pour les longues opérations
si tu le met dans la boucle en dehors du if c'est dangereux pcq ton appli risque de prendre trop de CPU pour rafraichir... il faut tester |
Bruce | Pas con, je vais essayer. |
antp | pour éviter que ça bloque il faut faire régulièrement des Application->ProcessMessages(); c'est-à dire juste après le memo->lines->add.
Peut-être que ça résoudra l'autre problème en même temps... [edit]--Message édité par antp--[/edit] |
Bruce | Heu... bon, je doit avouer avoir du mal à piger ta syntaxe... Le pascal est qd même légèrement différent... :) |
JWhy |
|
JWhy | beuh... j'fais du Delphi, moi... mais je vais essayer de te trouver un bout de code relativement clair... |
Bruce | Heu... tu n'aurrai pas un exemple de code qq part car je suis pas encore bien pro en prog... J'ai pompé ça sur un exemple fourni avec BC++ en adaptant à mes besoins...
Merci encore ! :) |
JWhy | oui, c'est normal... je me suis fait avoir de la meme facon...
|
Bruce | J'ai trouvé comment rediriger stdout
quasiment comme je le voulais (Je suis sous Borland c++ 4.0) Voilà, cela marche mais j'aimerais que cela marche légèrement différement... En effet, lorsque je lance ma commande, je suis obligé d'attendre que cette commande soit terminée pour que le résultat s'affiche dans mon Memo... De plus, tous le temps de la commande, l'application est comme "bloquée", impossible de déplacer la fenêtre par exemple... Si qq un peu m'aider, cela serait vraiment sympa... Merci d'avance ! Voici mon code : (précision, Rippack_RipFormBeta->Memo1 est le mémo dans lequel je sort, filepos est ma ligne de commande)
[edit]--Message édité par bruce--[/edit] |