Probleme de mise à jour de mes Edit Box
Bonjour
Je fais un prog similaire à un hyperterminal, J'ai donc fais un prog multithread, permetant l'envoi des caracteres ainsi que la reception de maniere concurente.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void ChyperterminalDlg::OnConnexion()
{
HWND *phObjectHandle = new HWND ;
if(RS232Obj.m_port_is_open==false)
{
// Ouverture du port Serie
RS232Obj.m_hPort=RS232Obj.open_serial_port(0, 9600, 8, 0, 1);
if(!RS232Obj.m_hPort)
exit(-1);
RS232Obj.m_port_is_open=true;
*phObjectHandle = GetSafeHwnd();
// Cree un nouveau thread
if(!AfxBeginThread(&Lire_Donnee, phObjectHandle))
{ // Could not create thread
EndDialog(IDCANCEL);
}
} |
Le problème est que le thread doit avoir le prototype suivant :
Code:
static UINT Lire_Donnee(LPVOID pvParam);
Le fait que celui ci soit static rend impossible la mise à jour de la variable de l'Edit Box (car non statique) ainsi que l'utilisation de la fonction UpdateData (meme problème).
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| UINT ChyperterminalDlg::Lire_Donnee(LPVOID pvParam)
{
DWORD Nb_Octet_a_lire;
DWORD Nb_Octet_lus;
DWORD StatusModem;
BOOL result;
Nb_Octet_a_lire=1;
//Configuration du masque du gestionnaire d'evenement
SetCommMask(RS232Obj.m_hPort, EV_RXCHAR);
while(RS232Obj.m_port_is_open==true)
{
// Attente d'un evenement
// Ici Attendre que le Buffer d'entree ait un caractere
WaitCommEvent(RS232Obj.m_hPort,&StatusModem,0);
//Reconfiguration du gestionnaire d'evenement
SetCommMask(RS232Obj.m_hPort, EV_RXCHAR);
// Lecture du Buffer
result=ReadFile(RS232Obj.m_hPort /* HANDLE du peripherique a lire*/,
&(RS232Obj.Donnee_lue) /* Buffer d'enregistrement
des donnees lues*/,
Nb_Octet_a_lire /* Nbre d'octets à lire au Max*/ ,
&Nb_Octet_lus /* Nbre d'octets Lus réellement */,
&(RS232Obj.m_Ov) /* Overlapped */);
if(!result) return -1; //Echec lors de la lecture
// Recuperation des donnees
if(!GetOverlappedResult( RS232Obj.m_hPort, &(RS232Obj.m_Ov), &Nb_Octet_lus, TRUE))
return -1;
}
//Fermeture demandée par l'utilisateur
AfxEndThread(0, // Fermeture normale du thread
TRUE //Efface le thread de la mémoire
);
return 0;
} |
Le caractere est correct (le debuggage me le confirme) mais je ne sais pas comment l'afficher dans mon EditBox. La variable associée à mon EditBox est du type CString.
Quelqu'un connaitrait une astuce pour que je puisse afficher un caractere des que je le recois.
Merci
Bibi