Discussion:
[SDL] race condition (sort of)? message box verus function return
speartip
2017-02-12 17:30:03 UTC
Permalink
Hi, my message box is appearing before function return before it...

Code:

cout<<"Call_SDL_GetCurrentDisplayMode"<<endl;
call_getCurrentDisplayMode(horizontal, vertical, &dm);
cout<< horizontal << "\t"<< vertical << '\n';

MessageBox(0,"ScreenTest", "Ready?", MB_OK);



Well screentest pops up, and when I press "Ok", the horizontal and vertical are then printed. I can live with it -- jut wanted to know whether this is a permanent condition or whether there wa a workaround.

Thx
Evan Ramos
2017-02-12 17:41:46 UTC
Permalink
Try replacing the '\n' with std::endl, or inserting std::flush after the '\n'.

-H
-----
"After you finish the first 90% of a project, you have to finish the
other 90%." - Michael Abrash
speartip
2017-02-13 17:24:49 UTC
Permalink
Hi,

Thank you for the solutions, they all worked. Of all the combinations I tried, the one below worked the best:


Code:

std::cout<< horizontal <<"\t"<<std::flush<< vertical << "\t"<<std::flush<<endl;




Generally speaking, why did flushing the stream and combinations, etc., work to speed up the routine?
Jonathan Dearborn
2017-02-13 18:20:48 UTC
Permalink
It doesn't speed anything up. There's also no race condition, because
these commands are all done on a single thread.

Output streams write to a memory buffer. That memory buffer needs to be
flushed so that it is actually sent to the output device (which could be
anything, not just a simple terminal). C and C++ separate writing and
flushing to give you more control. If you don't care about that control,
just use std::endl to write a newline and force a flush.

Jonny D
Post by speartip
Hi,
Thank you for the solutions, they all worked. Of all the combinations I
std::cout<< horizontal <<"\t"<
Generally speaking, why did flushing the stream and combinations, etc.,
work to speed up the routine?
_______________________________________________
SDL mailing list
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
Rainer Deyke
2017-02-14 21:46:10 UTC
Permalink
Post by speartip
std::cout<< horizontal <<"\t"<<std::flush<< vertical << "\t"<<std::flush<<endl;
'std::cout << std::endl' is equivalent to 'std::cout << '\n' <<
std::flush', so you're flushing three times here. That's a bad idea
because flushing slows down the program. I recommend this:

std::cout << horizontal << "\t" << vertical << "\t\n" << std::flush;

Flush exactly once, at the very end of your output, and always use
'std::flush' instead of 'std::endl' because 'std::flush is more explicit
about your intention.
--
Rainer Deyke - ***@eldwood.com
speartip
2017-02-13 20:58:43 UTC
Permalink
Hi, points well taken thanks.

What I meant by sped up was that now my cout information was arriving before by message box where it had not before.
speartip
2017-02-15 15:00:57 UTC
Permalink
Post by Rainer Deyke
Flush exactly once, at the very end of your output, and always use
'std::flush' instead of 'std::endl' because 'std::flush is more explicit
about your intention.
Yes, following that advice, that's true. Makes more sense when I look at the changes.
Post by Rainer Deyke
That's a bad idea
because flushing slows down the program.
So what's the best balance in a speed optimized routine?
Jonathan Dearborn
2017-02-15 15:05:37 UTC
Permalink
For optimizing speed, do not print anything at all. :)

Jonny D
Post by Rainer Deyke
Flush exactly once, at the very end of your output, and always use
'std::flush' instead of 'std::endl' because 'std::flush is more explicit
about your intention.
Yes, following that advice, that's true. Makes more sense when I look at the changes.
That's a bad idea
because flushing slows down the program.
So what's the best balance in a speed optimized routine?
_______________________________________________
SDL mailing list
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
speartip
2017-02-15 16:13:33 UTC
Permalink
[Idea]

Loading...