コード例 #1
0
ファイル: threads.c プロジェクト: spriteray/libevlite
int32_t iothread_start( struct iothread * self, uint8_t index, iothreads_t parent )
{
    self->index = index;
    self->parent = parent;

    self->sets = evsets_create();
    if ( self->sets == NULL )
    {
        iothread_stop(self);
        return -1;
    }

    self->cmdevent = event_create();
    self->queue = msgqueue_create( MSGQUEUE_DEFAULT_SIZE );
    if ( self->queue == NULL || self->cmdevent == NULL )
    {
        iothread_stop(self);
        return -2;
    }

    // 初始化命令事件
    event_set( self->cmdevent, msgqueue_popfd(self->queue), EV_READ|EV_PERSIST );
    event_set_callback( self->cmdevent, iothread_on_command, self );
    evsets_add( self->sets, self->cmdevent, 0 );

    // 启动线程
    pthread_attr_t attr;
    pthread_attr_init( &attr );
    //    assert( pthread_attr_setstacksize( &attr, THREAD_DEFAULT_STACK_SIZE ) );
    pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED );

    int32_t rc = pthread_create(&(self->id), &attr, iothread_main, self);
    pthread_attr_destroy( &attr );

    if ( rc != 0 )
    {
        iothread_stop(self);
        return -3;
    }

    return 0;
}
コード例 #2
0
int main(int agrc, const char *argv[])
{
    int fd, ret;
    fd_set rdflag;
    unsigned char keystate[KEYMAXNUM] = {};
    unsigned char bufstate[KEYMAXNUM] = {};
    s_inputdata event;
    s_msginfo msginfo_key5,msginfo_key4;
    s_ioMSG iomsg_key5, iomsg_key4;
    msginfo_key5.path_id = 'i';
    if(msgqueue_create(&msginfo_key5) != 0)
    {
        M_print_str("msgqueue_create fail");
    }
    msginfo_key4.path_id = 'j';
    msgqueue_create(&msginfo_key4);


    fd = open(getenv("KEYPAD_DEV"), O_RDONLY);//|O_NONBLOCK);
    if(fd < 0)
    {
        M_print_err(errno);
        return 1;
    }
    FD_ZERO(&rdflag);
    FD_SET(fd, &rdflag);
    while(1)
    {
        ret = select(fd+1, &rdflag, NULL, NULL, 0);
        if(!(ret > 0))
        {
            M_print_err(errno);
            FD_ZERO(&rdflag);
            FD_SET(fd, &rdflag);
            continue;
        }
        ret = read(fd, &event, sizeof(event));
        if(ret != sizeof(event))
        {
            continue;
        }
        switch(event.code)
        {
            case KEY5:
            //给进程发信号或者发消息
            if(event.value == KEY_DOWN)
            {
                iomsg_key5.mtype = 1;
                iomsg_key5.io_switch = OPENDOOR;
                iomsg_key5.t = time(NULL);
                msgsnd(msginfo_key5.id_msg, &iomsg_key5, sizeof(iomsg_key5)-sizeof(long), 0);
                D_M_PRINT(0, "send msg");
            }
            else //KEY_UP
            {}
            D_M_PRINT(event.value, "");
            break;
            case KEY4:
            //给进程发信号
            if(event.value == KEY_DOWN)
            {}
            else //KEY_UP
            {}
            D_M_PRINT(event.value, "");
            break;
            default:
            break;
        }
    }
    return 1;
}