Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 回拨问题_C - Fatal编程技术网

C 回拨问题

C 回拨问题,c,C,基本上,我尝试创建一个调度程序,但失败了,因为它总是“!event->callback\u function”,我的代码: #include "event.h" #include "memory.h" #include "thread.h" #include <stdio.h> #include <time.h> #include <assert.h> bool running; typedef struct Event { event_call

基本上,我尝试创建一个调度程序,但失败了,因为它总是“!event->callback\u function”,我的代码:

#include "event.h"
#include "memory.h"
#include "thread.h"

#include <stdio.h>
#include <time.h>
#include <assert.h>

bool running;

typedef struct Event {
    event_callback_t cb;
    time_t delay;
    void* p;
    struct Event* next;
} Event;

Event* g_events;

void _remove_event           __P((Event**, Event *));
void event_dispatch_internal        __P(());
void add_event_internal             __P((Event**, Event *));

void
event_dispatch()
{
    g_events = (Event *)MyMalloc(sizeof(*g_events));
    create_thread((callback_t)event_dispatch_internal, (void *)NULL);
}

void
add_event_internal(Event** events, Event* event)
{
    event->next = *events;
    *events = event;
}

void
add_event(callback, param, delay)
    event_callback_t callback;
    void *param;
    time_t delay;
{
    Event* event;
    event = (Event *)MyMalloc(sizeof(*event));
    assert(0 != event);

    event->delay = time(NULL) + delay;
    event->p = param;
    event->cb = callback;
    add_event_internal(&g_events, event);
}

void
_remove_event(Event** events, Event* event)
{
    event = *events;
    *events = event->next;
}

void
event_dispatch_internal()
{
#ifdef _DEBUG
    fprintf(stderr, "Events started\n");
#endif
    while (true) {
        Event* tmp;
        for (tmp = g_events; tmp; tmp = tmp->next) {
            if (time(NULL) >= tmp->delay) {
                tmp->cb(tmp->p);
#ifdef _DEBUG
                fprintf(stderr, "Executed event %p:%u\n", (void *)tmp, (unsigned int)tmp->delay);
#endif
                _remove_event(&g_events, tmp);
            }
        }
    }
}
它总是给出“无法执行事件blabla”

我这样称呼它:

            for (tmp = g_events; tmp; tmp = tmp->next) {
            if (time(NULL) >= tmp->delay) {
                if (!tmp->cb) {
                    tmp->cb(tmp->p);
#ifdef _DEBUG
                    fprintf(stderr, "Executed event %p:%u\n", (void *)tmp, (unsigned int)tmp->delay);
#endif
                } else {
                    fprintf(stderr, "Couldnt execute event %p:%u\n", (void *)tmp, (unsigned int)tmp->delay);
                }
            }
        }
void test_(void *);

void
test_(void *p)
{
    fprintf(stderr, "test(): %d\n", *(int *)p);
}

int main()
{
    int test;
    test = 5;
    event_dispatch();
    add_event(test_, (void *)&test, 1);
    do { } while (1);
    return 0;
}
任何帮助都会出现

您的代码没有任何意义。您触发一个线程,然后该线程一直循环,试图遍历
g_事件
列表。然而,在启动时,它只有一个未初始化的节点,所以任何事情都可能发生

此外(1),您的线程之间没有同步,因此即使您解决了上述问题,当人们试图添加事件时,您也可能会遇到严重的种族危险


此外(2),两个线程都有效地处于“繁忙等待”循环中,这将耗尽CPU。你需要研究一种机制,这种机制会导致你的线程一直处于休眠状态,直到有东西出现,比如信号量。

Woah-请格式化你的代码。我总是无法让它lol,sorry@Fallen:选择代码并按CTRL+K。好的,谢谢,有与问题相关的答案吗?:我们无法查看
事件回调\u t
的详细信息。对于新代码,使用
\u P((…)
机制是没有意义的;这是标准前编译器和标准C编译器之间的过渡帮助。
event\u dispatch\u internal()。它表示函数不返回任何值,可以接受任何参数列表;您可能想要
void事件\u分派\u内部(void)(或者,在您的符号中,
void event\u dispatch\u internal\u P((void));
)。