View previous topic :: View next topic |
Author |
Message |
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Thu Aug 02, 2007 11:04 pm Post subject: Konsoles non-blocking input |
|
Atceros sen atpakaļ taisīju kādai spēlei serveri uz LINUXa. Tajā paralēli servera darbībai (while loopam) varēja arī ievadīt komandas un kontrolēt servera darbību. Es lasīju taustiņu eventus ar UNIXa select, bet vai ir kāda iespēja kaut ko līdzīgu darīt arī uz Win platformas konsoles application? Man galvenais nosacījums ir, lai programma neapstādinātu loopu, kā tas ir std::cin, scanf gadījumos un lai darbotos backspace (vismaz, lai varētu jebkuru characteru aizstāt ar citu). _________________ long time; /* know C */ |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Thu Aug 02, 2007 11:11 pm Post subject: |
|
Mēģināju kautko uzgooglēt, laikam vienīgā iespēja būs multithreadings. _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Thu Aug 02, 2007 11:26 pm Post subject: |
|
Protams, ka ir iespējams. Tikai msdnu vajag tikai lasīt, nevis gūglēt ;)
Izmantojot GetNumberOfConsoleInputEvents fju var uztaisīt pollojošu konsoles inputa apstrādi, ja tas der. Man jau poll'ings personīgi nepatīk. Es labprātāk lietoju bloķējošas eventu apstrādes (GetMessage, select, un tml).
Te vēl citas konsoles funkcijas: http://msdn2.microsoft.com/en-us/library/ms682073.aspx
Bet multithreadings ar nav slikta lieta. Pareizi implementēts tas tikai palīdzēs.
Edit: ok, palasīju pats to GetNumberOfConsoleInputs fjas aprakstu. Tur laba lieta pateikta:
Quote: | A process can specify a console input buffer handle in one of the wait functions to determine when there is unread console input. When the input buffer is not empty, the state of a console input buffer handle is signaled. |
Tā ta zem Windowsa ir tāpatās kā zem nix'a. Vari mierīgi select'veidīgu funkciju izsaukt uz stdin/out/err handļiem un saņemt informāciju par to vai ir inputs vai nav, vai arī bloķēt kamēr nepienākt inputs.
T.i:
Code: | if (WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0) == WAIT_OBJECT_0) // gaida 0 milisekundes, var gaidīt ilgāk
{
// ir inputs
} |
Kas laikam jau ir visai loģiski - stdin/out jau ir parasti faili (aplikācijas levelī).
Last edited by bubu on Thu Aug 02, 2007 11:32 pm; edited 2 times in total |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Thu Aug 02, 2007 11:30 pm Post subject: |
|
Man pollings arī diezko nepatika (uz LINUXa), bieži nestrādāja, kā vajag un pie mazākām kļūdām sistēma vispār nestrādāja vai pat pakārās. Laikam būs jākož cauri multithreadings. Varbūt ir kāds labs cross-platform laibrarijs multithreadingam? Es te atradu boost, bet viņš baigi plašais izskatās. _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Thu Aug 02, 2007 11:32 pm Post subject: |
|
Multithreadingam ņem pthread. Zem windows tā arī ir noportēta.
Un kā gan pollings var nestrādāt/kārties? Tam gan neticu. Gan jau nebija pareizi uzrakstīts.
A bet boost's ir dikti laba lieta. Ne tikai threadingam. C++'am kā tādam :)
Last edited by bubu on Thu Aug 02, 2007 11:34 pm; edited 1 time in total |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Thu Aug 02, 2007 11:34 pm Post subject: |
|
Ideāli! Paldies! _________________ long time; /* know C */ |
|
Back to top |
|
|
|