[C, Win32] volani DLL funkce na pozadi
Lze nejak spustit z hlavniho programu (EXE) knihovni DLL funkci tak, aby bezela na pozadi? tedy aby se mi po volani z hl. programu hned vratila a ja bych pomoci jiny funkce obcas polloval jesi uz to dobehlo (jedna se o prenos dat po zmodemu v ty DLL). Nebo je to na windows utopie?
Este me napada, ze bych udal dalsi EXE kery by volal fci z DLLky a tento pomocny EXE bych spustil pres CreateProcess(), ale to uz mi pride moc vobstrukce...
Re: [C, Win32] volani DLL funkce na pozadi
pro paralelni soubeh se pod win i linuxem pouzivaji vlakna (thready).
dej si hlavne pozor na sdileni promennych mezi thready - k tomu se pouzivaji mutex a semafory (semaphores)
M.
Re: [C, Win32] volani DLL funkce na pozadi
aka utopie?, pouzi jednoducho vlakno
Re: [C, Win32] volani DLL funkce na pozadi
OK a jak mam teda zavolat funkci z DLLky, aby se spustila v dalsim vlakne?
Jde o volani jediny funce s 3 parametry, dale DLLka obsahuje funkci kera vraci
stav prenaseneho souboru a tak se muzu dovedet ze uz se prenesl cely.
Re: [C, Win32] volani DLL funkce na pozadi
Spustil bych si klasicky dalsi vlakno ve svem programu a v nem zavolal fci z dll a pak zjistoval tou druhou fci z dll stav.
Re: [C, Win32] volani DLL funkce na pozadi
Citace:
Původně odeslal
Anduril
Spustil bych si klasicky dalsi vlakno ve svem programu a v nem zavolal fci z dll a pak zjistoval tou druhou fci z dll stav.
Ok, takze pres CreateThread()? Hledam naky pouzitelny priklad, kdyby nekdo mel... (win32 api moc neznam)
Re: [C, Win32] volani DLL funkce na pozadi
Pouzil bych radeji _beginthread, resp. _beginthreadex, pokud lze a pouzivas normalni c/c++ runtime.
Re: [C, Win32] volani DLL funkce na pozadi
Tak uz se mi povedlo vytvorit tred:
Kód:
h_zmodem_thread = CreateThread(NULL,0,zmodem_thread,&zmodem_thread_arg,0,&zmodem_thread_id); // default security attributes, default stack size, thread function, arguments, default creation flags, returns the thread identifier
zatim jen pokusny:
Kód:
unsigned long WINAPI zmodem_thread(LPVOID iValue)
{
// this function is executed by the thread
int i;
// zde zavolat zmodem_send_file(...);
for (i=0; i<100; i++)
{
printf("thread\n");
Sleep(100);
}
ExitThread(0);
}
este potrebuju vykoumat jak funguje predavani argumentu
EDIT: predavani argumentu je v poho pres voidpointer, kery si pretypuju na char (volam se jmenem souboru)
ale este jak precist navratovou hodnotu po skonceni tredu?
EDIT2: jo tak uz vim
Kód:
GetExitCodeThread(h_zmodem_thread,(unsigned long *)&tx_size);
Re: [C, Win32] volani DLL funkce na pozadi
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
...
}