PDA

View Full Version : [Builder C++] Strano comportamento di un loop!!!


isola81
21-03-2003, 14:14
Sto realizzando un applicazione con il Builder C++ ed ho notato un comportamento strato.
Ecco il codice in questione:

while(recv_buff!=KEY_ESC){
...
err=recv(asock, &recv_buff, 1, 0);
Memo1->Lines->Add(AnsiString(recv_buff));
send(asock, &recv_buff, 1, 0);
...
}

Le linee dell'oggetto Memo1 non vengono visualizzate man mano che vengono ricevute ma tutte assieme quando il ciclo si chiude mentre la funzione send fa in suo lavoro ad ogni ciclo!!!

:muro:

Mi sapreste dare una mano??? THX :(

BountyKiller
21-03-2003, 14:22
l'argomento del while è una condizione logica quindi per fare il confronto non devi usare l'operatore di assegnazione = ma quello di confronto ==
prova e fammi sapere.
ciao!!

lombardp
21-03-2003, 15:09
Originally posted by "isola81"

Le linee dell'oggetto Memo1 non vengono visualizzate man mano che vengono ricevute ma tutte assieme quando il ciclo si chiude mentre la funzione send fa in suo lavoro ad ogni ciclo!!!

Mi sapreste dare una mano??? THX :(

Non ho mai programmato in BC++ (ho usato solo VC++), per cui avanzo solo un'ipotesi: possibile che manchi una sorta di comando di "refresh" dell'interfaccia grafica subito dopo Memo1->Lines->Add ?

ilsensine
21-03-2003, 15:16
Metti Application->ProcessMessages() subito dopo la scrittura sulla memo.

misterx
21-03-2003, 16:11
Originally posted by "isola81"

Sto realizzando un applicazione con il Builder C++ ed ho notato un comportamento strato.
Ecco il codice in questione:

while(recv_buff!=KEY_ESC){
...
err=recv(asock, &recv_buff, 1, 0);
Memo1->Lines->Add(AnsiString(recv_buff));
send(asock, &recv_buff, 1, 0);
...
}

Le linee dell'oggetto Memo1 non vengono visualizzate man mano che vengono ricevute ma tutte assieme quando il ciclo si chiude mentre la funzione send fa in suo lavoro ad ogni ciclo!!!

:muro:

Mi sapreste dare una mano??? THX :(


metti Memo1->Update();

isola81
21-03-2003, 16:32
Originally posted by "ilsensine"

Metti Application->ProcessMessages() subito dopo la scrittura sulla memo.

Grazie Mille!!
Adesso il mio caro server TELNET funziona perfettamente!!!

Effettivamente non conoscevo questa funzione e devo dire che in certi casi risulta veramente utile infatti forza l'applicazione a processare gli eventi che per un motivo qualsiasi sono rimasti in query!!!

:)

ilsensine
21-03-2003, 16:45
Attento: è un'arma a doppio taglio, imparerai presto perché ;)
Se riesci a risolvere in qualche altro modo sarebbe consigliabile.

isola81
21-03-2003, 17:13
Ti riferisci ai casi in cui gli eventi in quere sono troppi??

PS: Non vorrei aprire un altro thread, potresti dirmi come faccio con il builder ad includere tutte le librerie necessarie nell'eseguibile per non avere alcun proplema di portabilità!!! THX

ilsensine
21-03-2003, 19:52
Originally posted by "isola81"

Ti riferisci ai casi in cui gli eventi in quere sono troppi??
Ehm...no. Prova a premere due volte il pulsante :D

PS: Non vorrei aprire un altro thread, potresti dirmi come faccio con il builder ad includere tutte le librerie necessarie nell'eseguibile per non avere alcun proplema di portabilità!!! THX
Tra le opzioni del progetto, devi includere le rtl (deseleziona use dynamic rtl nel tab linker) e i pacchetti della vcl (deseleziona build with runtime packages nel tab packages)

misterx
21-03-2003, 20:05
Originally posted by "ilsensine"

Attento: è un'arma a doppio taglio, imparerai presto perché ;)
Se riesci a risolvere in qualche altro modo sarebbe consigliabile.


infatti, negli esempi di BCB, si riesce a fare ciò che si vuole, anche ad interrompere il programma, senza che venga fatto uso della Application->ProcessMessages()

ma non ci ho mai nasato più di tanto per capirne il funzionamento

misterx
21-03-2003, 20:11
ehi, isola81 prova questo e dimmi se ti funziona


ShellExecute(0, "print" , "mpagina.htm",NULL, NULL,SW_SHOW );