DWORD WINAPI wf_update_thread(LPVOID lpParam) { int index; DWORD fps; wfInfo* wfi; DWORD beg, end; DWORD diff, rate; wfi = (wfInfo*) lpParam; fps = wfi->framesPerSecond; rate = 1000 / fps; while (1) { beg = GetTickCount(); if (wf_info_lock(wfi) > 0) { if (wfi->peerCount > 0) { wf_info_update_changes(wfi); if (wf_info_have_updates(wfi)) { wf_update_encode(wfi); for (index = 0; index < wfi->peerCount; index++) SetEvent(wfi->peers[index]->updateEvent); for (index = 0; index < wfi->peerCount; index++) WaitForSingleObject(wfi->updateSemaphore, INFINITE); wfi->lastUpdate = wfi->nextUpdate; } } wf_info_unlock(wfi); } end = GetTickCount(); diff = end - beg; if (diff < rate) { Sleep(rate - diff); } } return 0; }
static DWORD WINAPI wf_peer_mirror_monitor(LPVOID lpParam) { DWORD fps; wfInfo* wfi; DWORD beg, end; DWORD diff, rate; freerdp_peer* client; wfPeerContext* context; fps = 24; rate = 1000 / fps; client = (freerdp_peer*) lpParam; context = (wfPeerContext*) client->context; wfi = context->info; while (1) { beg = GetTickCount(); if (wf_info_lock(wfi) > 0) { if (wfi->peerCount > 0) { wf_info_update_changes(wfi); if (wf_info_have_updates(wfi)) { wf_update_encode(wfi); SetEvent(wfi->updateEvent); } } wf_info_unlock(wfi); } end = GetTickCount(); diff = end - beg; if (diff < rate) { Sleep(rate - diff); } } wf_info_lock(wfi); wfi->threadCount--; wf_info_unlock(wfi); return 0; }
DWORD WINAPI wf_update_thread(LPVOID lpParam) { int index; DWORD fps; wfInfo* wfi; DWORD beg, end; DWORD diff, rate; wfi = (wfInfo*) lpParam; fps = wfi->framesPerSecond; rate = 1000 / fps; while (1) { beg = GetTickCount(); if (wf_info_lock(wfi) > 0) { if (wfi->activePeerCount > 0) { wf_info_update_changes(wfi); if (wf_info_have_updates(wfi)) { wf_update_encode(wfi); //printf("Start of parallel sending\n"); for (index = 0; index < wfi->peerCount; index++) { if (wfi->peers[index]->activated) { //printf("Setting event for %d of %d\n", index + 1, wfi->activePeerCount); SetEvent(((wfPeerContext*) wfi->peers[index]->context)->updateEvent); } } for (index = 0; index < wfi->activePeerCount; index++) { //printf("Waiting for %d of %d\n", index + 1, wfi->activePeerCount); WaitForSingleObject(wfi->updateSemaphore, INFINITE); } //printf("End of parallel sending\n"); wf_info_clear_invalid_region(wfi); } } wf_info_unlock(wfi); } end = GetTickCount(); diff = end - beg; if (diff < rate) { Sleep(rate - diff); } } //printf("Exiting Update Thread\n"); return 0; }