Покотиленко Костик пишет:
В Пнд, 16/03/2009 в 21:43 +0900, Alexander Danilov пишет:
Покотиленко Костик пишет:
В Суб, 14/03/2009 в 10:30 +0900, Alexander Danilov пишет:
Покотиленко Костик пишет:
В Птн, 13/03/2009 в 23:24 +0900, Alexander Danilov пишет:
Покотиленко Костик пишет:
В Птн, 13/03/2009 в 14:39 +0300, Victor Wagner пишет:
On 2009.03.13 at 11:38:27 +0200, Покотиленко Костик wrote:

Вот-вот.

Плохая практика: прога с CLI + фронтенд
Хорошая практика: прога с CLI <-- либа --> прога с GUI
Абсолютно не факт. первый вариант выносит содержательные действия в
отдельный процесс, существенно упрощает отладку и облегчает избавление
от блокировок GUI, когда программа занята чем-нибудь важным.

В 90% случаев, на которые мне приходилось смотреть в дистрибутиве
(естественно, это далеко не все библиотеки, которые в нем есть) авторы библиотек не имели не малейшего понятия, как следует дизайнить
интерфейсы библиотек. А это, между прочим, гораздо более сложная задача
чем дизайн CLI, заточенного под встраивание.

Ну и покрыть функциональность автоматизированными тестами в случае CLI
гораздо проще.
Ни капли не согласен, особенно когда участвуют циклы. CLI->GUI не проще
ни разу, ни в разработке, ни в использовании, ни в отладке. Кроме,
конечно, случая, когда разработчик не умеет либы писать.

Проще, надо только понимать, что проще не в Си, я в языках, в которых есть 
нормальная обработка
событий, например, :) Tcl. Можно рулить одновременно многими cli процессами, в том числе и одинаковыми, а вот на Си, это будет не так уж просто. А в питоне или ruby есть событийная обработка на сокетах или каналах ввода/вывода?
Ты на Си в музее смотрел?

И давно на Си можно сделать событийную обработку канала или сокета в ТРИ строки?
Вот универсальная конструкция для select:

    char strtmp[1024];
    struct timeval tv;
    int retval;

    fd_set rfds;
    fd_set wfds;

    for(;;) {

        FD_ZERO(&rfds);
        FD_ZERO(&wfds);
        FD_SET(0, &rfds);
        FD_SET(1, &wfds);

        tv.tv_sec = 5;
        tv.tv_usec = 0;

        retval = select(1, &rfds, &wfds, NULL, &tv);

        if(retval>0) {

            /* Processing connections */
            if(FD_ISSET(0, &rfds)) {
                // read(0, buf, 1024);
            }
            if(FD_ISSET(1, &wfds)) {
                // write(1, buf, 1024);
            }
        } else if(retval==-1) {
            if(errno!=4) {  /* Interrupted system call, we get that for SIGHUP
*/
                sprintf(strtmp, "Select failed: errno=%d, %s", errno,
strerror(errno));
                write(2, strtmp, strlen(strtmp));
                exit(5);
            } else {
                sprintf(strtmp, "Select failed: errno=%d, %s, (Interrupted 
system
call, we get that for SIGHUP)\n", errno, strerror(errno));
                write(2, strtmp, strlen(strtmp));
            }
        } else {
        }
    }


Сударь, я спрашивал про 3 (ТРИ) строки, а в вашем примере только инициализация занимает пол экрана, так я ещё и не вижу где тут собыйтийная обработка данных, нет её тут.

Естественно не видите, мелко сильно.


Вы видимо не в курсе про событийное программирование, продолжать не стану, 
полагаю, что
это бессмысленно.


--
To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Ответить