Давайте предположим, что я получил немного GLib
пример, который проверяет stdin
поток (читает строку из GIOchannel
связаны с этим
io_stdin = g_io_channel_unix_new(fileno(stdin));
Через g_io_chanell_read_line())
,
Получить данные из него и делать вещи.
Этот пример должен был работать под CMD, Мне нужно, чтобы он работал под приложение win32.
Очевидно, у меня нет консоли для печати stdin
, но я могу получить эти данные в виде строковой переменной, так как пользователь напечатает их в поле ввода моего приложения.
И действительно, мне не нужна консоль, в принципе, что для меня важно — этот стандартный поток ввода все еще существует и работает где-то под капотом приложения win32 и поэтому может быть прочитан g_io_chanell_read_line(io_stdin...)
?
Могу ли я передать эти строковые данные ему g_io_channel_write(io_stdin...)
и заставить все это работать, или, если нет, мне нужно сделать свой собственный поток для привязки к GIOChannel
, и как?
Изменить: некоторые разъяснения:
Несколько отдельных процессов; в одном процессе пользователь вводит некоторые данные в поле ввода (не поле win32, фактически поле ввода HTML), этот процесс получает эти данные и может делать с ними все, что угодно — отправлять их другому процессу, переменной или чему-либо еще.
Между тем, другой процесс в потоке, отделенный от основного потока win32, должен искать это значение и, как только он его получит, делать вещи.
Решение этого «следить за данными и делать вещи» должно быть мультиплатформенным и основанным на Glib.
Я думал об отправке этих данных в GIOchannel, потому что это было так, как это было сделано в примере cmd.
Вот часть, из которой я пытаюсь сделать эквивалент:
while (!exit_thread) {
GIOStatus s = g_io_channel_read_line (io_stdin, &line, NULL, NULL, NULL);
if (s == G_IO_STATUS_NORMAL) {
gsize sdp_len;
sdp = (gchar *) g_base64_decode (line, &sdp_len);
// Parse remote candidate list and set it on the agent
if (sdp && nice_agent_parse_remote_sdp (agent, sdp) > 0) {
g_free (sdp);
g_free (line);
break;
} else {
fprintf(stderr, "ERROR: failed to parse remote data\n");
printf("Enter remote data (single line, no wrapping):\n");
printf("> ");
fflush (stdout);
}
g_free (sdp);
g_free (line);
} else if (s == G_IO_STATUS_AGAIN) {
#if defined(__unix__) || defined(__unix)
usleep (100000);
#else
Sleep (100);
#endif
}
}
И теперь я думаю, какого черта я не могу просто сделать while(//something//) { if (//string is not empty//) {do stuff and brake or give error} else {run while another iteration}
Задача ещё не решена.
Других решений пока нет …