Tak nakonec to dopadlo nak takle:
Kód:
//***************** vlakno ZModem prenosu, ktere je spusteno na pozadi, vola funkci zsend_file() z DLL
unsigned long STDCALL zmodem_thread(LPVOID fname)
{
...
tx_size=zsend_file(com_port,(char *)fname,sname); // posli soubor, funkce si sama otevre a zavre port
...
ExitThread(tx_size); // ukonci vlakno a vrat skutecne prenesenou velikost dat
}
Kód:
//***************** provede upload daneho souboru po ZModemu *****************
int zmodem_upload(char *fname) // vrati 0 pokud vse OK
{
FILE *zfile; // soubor pro prenos ZModemem
HANDLE h_zmodem_thread; // handle na nove vlakno ZModem prenosu
unsigned long zmodem_thread_id; // ID noveho vlakna ZModem prenosu
long zfile_size; // velikost prenaseneho souboru
long tx_size; // skutecne prenesena velikost
long cnt; // pocitadlo prenosu 0-65535
if (h_zdll==NULL) // pokud DLLka nebyla nactena
{ // loadni zmodem.dll
if ((h_zdll=LoadLibrary("zmodem.dll"))==NULL)
...
printf("\nZModem uploading file %s [%lu B]\n",fname,zfile_size);
zclear_gauge();
if ((h_zmodem_thread=CreateThread(NULL,0,zmodem_thread,fname,0,&zmodem_thread_id))==NULL) // default security attributes, default stack size, thread function, ptr to arguments, default creation flags, returns the thread identifier
{ // pokud se nepodarilo vytvorit vlakno ZModem prenosu
printf("\nERROR: cannot create ZModem thread\n");
return(-3); // tak skonci
}
while ((cnt=zreturn_gauge())<65535) // pokud pocitadlo prenosu nedojelo na konec
{ // vypis procenta prenosu
printf("\rtransfered: %u%%",zreturn_gauge()/655);
Sleep(100); // a mezitim cekej
}
printf("\rtransfered: %u%%",zreturn_gauge()/655); // vypis posledni cteni ukazatele (100%)
WaitForSingleObject(h_zmodem_thread,INFINITE); // pockej pro jistotu na ukonceni threadu
GetExitCodeThread(h_zmodem_thread,(unsigned long *)&tx_size); // precti navratovou hodnotu threadu
...
}