begin process at 2012 05 28 21:43:43
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

MFC

 > 

Comment rédémarer un thread automatiquement quand il se termine.


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Comment rédémarer un thread automatiquement quand il se termine.

samedi 22 août 2009 à 00:15:48 | Comment rédémarer un thread automatiquement quand il se termine.

jerem3000


Bonjour,

Donc tous est dans le titre :

Méme si je pense que cela n'est pas trés propre je ne vois pas d'autre solution a mon probléme.

Voici mon thread si vous en avez besoin :

Code C/C++ :
DWORD WINAPI EnvoieEmail ( LPVOID IpvThreadParam )

{
email();
Sleep(60000);

return 0;
}

HANDLE hThreads [ 2 ] ;
DWORD dwThreadId ;
DWORD dwThreadParam = 1 ;
hThreads [ 1 ] = CreateThread ( NULL, NULL, EnvoieEmail, &dwThreadParam, 0, &dwThreadId ) ;
CloseHandle ( hThreads [ 1 ] ) ;



Voila en espérant que cela soit possible.

merci d'avance
jérémy

samedi 22 août 2009 à 02:30:49 | Re : Comment rédémarer un thread automatiquement quand il se termine.

juju12

Code C/C++ :

DWORD WINAPI EnvoieEmail ( LPVOID IpvThreadParam )
{
lbl_Loop:
email();
Sleep(60000);
goto lbl_Loop;
return 0;
}


ce qui ne répond pas vraiment à ta question mais a l'effet recherché;

ou bien :

Code C/C++ :

DWORD WINAPI EnvoieEmail ( LPVOID IpvThreadParam )
{
email();
Sleep(60000);
return 0;
}


// fonction principale

lbl_Loop:
HANDLE hThread=CreateThread(...);
if(hThread)
{
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
}
goto lbl_Loop;

samedi 22 août 2009 à 04:04:30 | Re : Comment rédémarer un thread automatiquement quand il se termine.

jerem3000

Merci beaucoup c exactement ce que je chercher , je penser que cela aller regler mon probléme mais enfaite non

en gros ma fonction email envoie le contenue d'un fichier .txt par email.
je souhaite qu'il y est un Sleep() pour pas non plus être flood d'email.

Mais il y a deux problèmes :

1- la fonction email ne se lance que 2 fois et je ne sais pas pourquoi ( en tous cas je ne reçoit que 2 email)
2- Le fichier .txt aura bien-sur changer entre le premier et les autre envoie mais on dirait qu'il garde en mémoire le 1er email car je reçoit toujours le même pour le second email alors que la fonction est normalement terminer la première fois et que j'initialise les variable

je vous colle ma fonction email.

En tous cas merci beaucoup pour goto (souvenir du basic ) cela va beaucoup me servir


jérémy

samedi 22 août 2009 à 11:12:17 | Re : Comment rédémarer un thread automatiquement quand il se termine.

juju12

Si tu as utilisé la première solution, faut pas que la fonction principale se termine avant les autres threads sinon ils sont tous arrêtés (le thread principal appelle ExitProcess()); d'où l'utilisation de WaitForSingleObject() et consorts, que tu peux mettre en fin de procédure éventuellement.
Bon, je ne sais pas si cela explique ton problème, faudrait mettre un peu plus de code.

Quant à goto, beaucoup de gens refusent de l'utiliser dans un code en C, soi-disant que ça engendre un manque de visibilité etc... Moi je crois que c'est juste à cause du Basic
En l'occurence il y avait d'autres possibilités pour une boucle infinie :

Code C/C++ :

while(1)
{
...
}



Code C/C++ :

for(;;)
{
...
}

samedi 22 août 2009 à 12:46:08 | Re : Comment rédémarer un thread automatiquement quand il se termine.

jerem3000

Oups j'ai complètement oublier de coller ma fonction mail.
J'ai déjà essayer une boucle infinie avec while(1) mais cela ne marcher pas. J'ai l'impréssion que la seconde fois que la fonction email est lancer elle ne se termine pas je ne vois pas trop pourquoi cela fait sa.

Code C/C++ :
#define TAILLE_MAX 10000


#include <winsock.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <cstdio>
#include <sstream>
#include <fstream>


#pragma comment(lib,"ws2_32.lib")
SOCKET to_server_socket = 0;
char * server_name;
int port = 25;

char destinataire[120] = "RCPT To: <";
char sender[120] = "MAIL From: <";
char * exp;
char * dest;
char * sujet;
char * message;
char buffer[15];
char body[1100] = "Subject: ";



void bcopy( void * source, void * destination, int size )
{
char * src = ( char * ) source;
char * dst = ( char * ) destination;

for( int i=0; i<size; i++ )
dst[i] = src[i];
}

void bzero( void * destination, int size )
{
char * dst = ( char * ) destination;

for( int i=0; i<size; i++ )
dst[i] = 0x00;
}

void Process( char * buffer )
{
Sleep( 1000 );

int size = strlen( buffer );
int retVal = send( to_server_socket, buffer, size, 0 );

char buf[ 1024 ];
buf[0] = 0x00;
while( !buf[0] )
int yeah = recv( to_server_socket, buf, 1024, 0 );

}

int email()
{
std::string contenue = "";
FILE* fichier = NULL;
char chaine[TAILLE_MAX] = "";

fichier = fopen("C:\\readme.txt", "r");

if (fichier != NULL)
{
while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
{
contenue += chaine;
}

fclose(fichier);
}


//FILE* fichier2 = NULL;
//fichier2 = fopen("C:\\readme.txt", "w+" );
//fclose(fichier2);
const char *CstStr2 = contenue.c_str ();

if (contenue == "")
{
return 0;
}



if (strcmp(CstStr2,buffer) == 0) {
exit( -1 );
}
int not = 0;
unsigned long ioctl_blocking = 1;

/*cout<<"Entrez le nom du serveur smtp ou son ip\n";
cin>>server_name;
cout<<"Entrez l'adresse email de l'expediteur\n";
cin>>exp;
cout<<"\nEntrez l'adresse email du destinataire\n";
cin>>dest;
cout<<"\nEntrez le sujet du mail\n";
cin>>sujet;
cout<<"\nEntrez votre message\n";
cin>>message;*/


server_name = "smtp.orange.fr";
exp = "******";
dest = "*****";
sujet = "le sujet";

strcat(sender,exp);
strcat(sender,">\r\n");
strcat(destinataire,dest);
strcat(destinataire,">\r\n");
strcat(body,sujet);
strcat(body," \r\n\r\n ");
strcat(body,CstStr2);
strcat(body," \r\n.\r\n");

WSADATA wsaData;
if( int err = WSAStartup( 0x0101, &wsaData ) )
{

exit( -1 );
}


struct sockaddr_in serverSockAddr; // addresse de la socket
struct hostent * serverHostEnt; // description du host serveur
long hostAddr; // addr du serveur

bzero( &serverSockAddr, sizeof( serverSockAddr ) ); // initialise a zero serverSockAddr
// converti l'adresse ip 9.100.1.1 en entier long
hostAddr = inet_addr( server_name );

if( ( long ) hostAddr != ( long ) -1 )
bcopy( &hostAddr, &serverSockAddr.sin_addr, sizeof( hostAddr ) );
else // si on a donne un nom
{
serverHostEnt = gethostbyname( server_name );
if ( serverHostEnt == NULL )
{

exit( 0 );
}
bcopy( serverHostEnt->h_addr, &serverSockAddr.sin_addr, serverHostEnt->h_length );
}

serverSockAddr.sin_port = htons( port ); // host to network port
serverSockAddr.sin_family = AF_INET; // AF_*** : INET=internet
// creation de la socket

to_server_socket = socket( AF_INET, SOCK_STREAM, 0 );
if ( to_server_socket < 0)
{

exit( 0 );
}

setsockopt(to_server_socket, SOL_SOCKET, SO_DONTLINGER, (char *) &not, sizeof(not));


// requete de connexion
if( connect( to_server_socket, ( struct sockaddr * ) &serverSockAddr,
sizeof( serverSockAddr ) ) < 0 )
{

exit( 0 );
}

ioctlsocket ( to_server_socket, FIONBIO, &ioctl_blocking );

char buf[ 1024 ];
buf[0] = 0x00;
while( !buf[0] )
int yeah = recv( to_server_socket, buf, 1024, 0 );


Process( "EHLO Toto\r\n" );
Process( sender ); // mail de l'expediteur
Process( destinataire ); // mail du destinataire
Process( "DATA\r\n" );
Process( body );
Process( "QUIT\r\n" );
/* fermeture de la connection */
shutdown( to_server_socket, 2 );
contenue.erase();
closesocket( to_server_socket );
return 0;
}



jérémy

samedi 22 août 2009 à 14:51:25 | Re : Comment rédémarer un thread automatiquement quand il se termine.

juju12

Réponse acceptée !

Tu as toute une série de strcat(sender,exp) etc...
La première fois pas de problème... mais tu ne réinitialises pas ces variables (elles sont GLOBALES) donc à chaque fois que tu appelles la fonction t'ajoutes un truc derrière et forcément ça veut plus rien dire.
Voilà déjà un point à corriger, peut-être autre chose après.

Ensuite, bon, c'est pas super joli...
Tu utilises l'API (CreateThread etc...) donc autant le faire pour tout, notamment la lecture de fichier :
fonctions utiles CreateFile, GetFileSize, ReadFile...
Ca serait même plus élégant en l'occurence de passer par le file mapping :
CreateFileMapping et MapViewOfFile pour récupérer directement un pointeur sur le texte à transmettre, sans s'embêter à devoir le copier.

samedi 22 août 2009 à 15:57:16 | Re : Comment rédémarer un thread automatiquement quand il se termine.

jerem3000

elle sont toute réinitialiser car on relit le fichier et on met le contenue dans CstStr2 donc vu que sa envoie comme contenue CstStr2 il ne devrait pas y avoir de problème.

toute les variable sont initialiser ou une valeur et défini avant l'envoie.
mais le fichier texte si il est modifier entre 2 envoie ne change pas il n'y a rien qui se rajoute.

je viens quand méme de modifier par :

Code C/C++ :
char destinataire[120] = "RCPT To: <";

char sender[120] = "MAIL From: <";
char * exp = "";
char * dest = "";
char * sujet = "" ;[del][/del]
char * message = "";
char buffer[15] = "";
char body[1100] = "Subject: ";


et cela na rien changer.

Cela est mon premier programme donc que cela ne soit pas jolie pour l'instant c pas trop grave je corrigerai sa quand il marchera car la j'en est besoin rapidement

jérémy

samedi 22 août 2009 à 17:05:44 | Re : Comment rédémarer un thread automatiquement quand il se termine.

juju12

Oui le problème c'est sur les variables sender, destinataire...
c'est celles-ci qui devraient être initialisées en début de fonction; regarde un peu leur contenu en cours d'exécution (tu peux les afficher dans la console par ex.)...

lundi 24 août 2009 à 16:14:28 | Re : Comment rédémarer un thread automatiquement quand il se termine.

jerem3000


Tu avait raison cela venait bien de sa. merci beaucoup

jérémy

vendredi 4 septembre 2009 à 15:39:11 | Re : Comment rédémarer un thread automatiquement quand il se termine.

magicientarik

bonjour,
si vous pouvez m'aider, je veux developper un thread qui lit à partir d'un fichier txt ligne par ligne avant d'inserer la ligne dans une BDD, pour le moment ce que je cherche c'est de créer un thread de lecture de fichier txt en C++ sous windows.
Merci d'avance

Tarik


1 2

Cette discussion est classée dans : thread, automatiquement, dword, hthreads, rédémarer


Répondre à ce message

Sujets en rapport avec ce message

Prob de thread [ par sebastienbro ] Bonjour, j'ai un problème avec des thread, je n'arrive pas a en créer un :(Voici mon code : HANDLE hThread1;DWORD dwThreadId1;DWORD WINAPI T [API Win32 sans MFC] Lecture port série: thread bloqué [ par nitrique ] Bonjour à tous, Je lis des données dès qu'elle arrivent sur le port COM avec la fonction WaitCommEvent. Pour éviter de figer l'application, j'util Problème de Thread [ par F0ra ] bonjourje réalise une application en openGl, et j'ai besoin d'un Threadpourquoi mon Thread ne s'exécute pas ?merci beaucoup@+ #include "main.h"DWORD W thread et paramètres [ par sena ] sujet : thread et paramètresbonjour,voila j'ai fait un petit programme de test pour l'éxcution de thread.je souahiterais faire la même chose en passan thread qui ne se termine pas ! [ par gdpasmini ] Hello !!j'ai un petit probleme. je crée des threads dans un progamme C sous visual c++ express edition sans MFC. Mais voila, je n'arrive pas a les arr Redirection sortie standard processus [ par bouba ] Bonjour, j'ai un programme qui créer un nouveau thread avec la fonction ShellExecute de l'API Win32 afin de lancer un exécutable. Le thread ainsi lanc probleme de pointeur et de thread?? [ par glycefr ] Bon jours,Voila j'essaie de faire un petit programe afin de me familiariser avec les thread... Afin de pouvoire passer des parametres a mon thread je thread [ par baby3378 ] bonjours a tous, je sais que ce type de question fut posé maintes et maintes fois sur le forum mais je tente quand même ma chance. Voila, j'ai fait u Difference entre DWORD et unsigned int [ par mrous ] Bonjour,je crois que j'ai tt dit ds le titre, je voudrais savoir quelle est la difference entre DWORD et un unsigned int? Il me semble que c la meme c Thread [ par diablo31170 ] Salut à tous,Comme le titre l'indique, je vais parler de Thread sous Linux en C++.Mon problème est de permettre l'affichage de l'horloge en meme temps


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales