After the function return, we can see the result on screen or it's not guaranteed.
I found a strange issue when testing multi-monitor performance(try to get the maximal FPS).
For each monitor I create a thread, in the thread function I create a child window, Direct3D device and present continuously. The pseudo code looks like:
DWORD dwStartTime = timeGetTime();
DWORD dwEndTime = timeGetTime();
dwEndTime - dwStartTime is about 7ms, it seems that the FPS should be 1000 / 7 = 142. but the actual FPS is about 30. I debug and find that the interval after execute the last line code(DWORD dwEndTime = timeGetTime();) and go back to the first line(DWORD dwStartTime = timeGetTime();) is about 25ms, so it slow down the FPS. It seems that the CPU can't get the time slice and can't run this thread's code, but at that time the CPU usage is only about 10%.
The test result is base on the machine utilize 4 display cards and 16 outputs, all threads almost get the same result; when only utilize 2 display cards, the actual FPS can reach to 80 for each moniotor.
I can't understand why this happen? In despite of Present function is sync or async, after execute the last line code, is should execute the first line code very quickly if cpu usage is low.