?
hi,
eine queue kann man z.b. mit verketteten listen aufbauen, hier haste mal ein beispiel:
// nt_lists.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include <stdio.h>
#define C_OFFSET(t,f) ((char*)&(((t*)0)->f))
#define C_BASE(a,t,f) ((t*)((char*)(a)-C_OFFSET(t,f)))
typedef struct _NT_LIST_ENTRY
{
struct _NT_LIST_ENTRY *Flink;
struct _NT_LIST_ENTRY *Blink;
} NT_LIST_ENTRY;
#define InitializeListHead(ListHead) (\
(ListHead)->Flink = (ListHead)->Blink = (ListHead))
#define IsListEmpty(ListHead) \
((ListHead)->Flink == (ListHead))
#define RemoveHeadList(ListHead) \
(ListHead)->Flink;\
{RemoveEntryList((ListHead)->Flink)}
#define RemoveTailList(ListHead) \
(ListHead)->Blink;\
{RemoveEntryList((ListHead)->Blink)}
#define RemoveEntryList(Entry) {\
NT_LIST_ENTRY *_EX_Blink;\
NT_LIST_ENTRY *_EX_Flink;\
_EX_Flink = (Entry)->Flink;\
_EX_Blink = (Entry)->Blink;\
_EX_Blink->Flink = _EX_Flink;\
_EX_Flink->Blink = _EX_Blink;\
}
#define InsertTailList(ListHead,Entry) {\
NT_LIST_ENTRY *_EX_Blink;\
NT_LIST_ENTRY *_EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Blink = _EX_ListHead->Blink;\
(Entry)->Flink = _EX_ListHead;\
(Entry)->Blink = _EX_Blink;\
_EX_Blink->Flink = (Entry);\
_EX_ListHead->Blink = (Entry);\
}
#define InsertHeadList(ListHead,Entry) {\
NT_LIST_ENTRY *_EX_Flink;\
NT_LIST_ENTRY *_EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Flink = _EX_ListHead->Flink;\
(Entry)->Flink = _EX_Flink;\
(Entry)->Blink = _EX_ListHead;\
_EX_Flink->Blink = (Entry);\
_EX_ListHead->Flink = (Entry);\
}
////////////////////////////////////////////////////////////////////////
typedef struct _testlist
{
int lala;
char buh;
long blubb;
NT_LIST_ENTRY list;
char array[8];
} TESTLIST;
/*
int main()
{
TESTLIST t;
TESTLIST *tp1 = &t;
TESTLIST *tp2 = C_BASE (&t.blubb, TESTLIST, blubb);
if (tp1 == tp2)
printf ("Bingo");
Sleep(INFINITE);
}
*/
int main ()
{
NT_LIST_ENTRY list1;
TESTLIST tl[10];
int s;
InitializeListHead (&list1);
for (s=0; s<10; s++)
InsertHeadList (&list1, &(tl[s].list));
while (1)
{
NT_LIST_ENTRY *l;
if (IsListEmpty(&list1))
break;
l = RemoveHeadList (&list1);
printf ("%p\n", l);
}
printf ("--------------------------\n");
for (s=0; s<10; s++)
InsertHeadList (&list1, &(tl[s].list));
while (1)
{
NT_LIST_ENTRY *l;
if (IsListEmpty(&list1))
break;
l = RemoveTailList (&list1);
printf ("%p\n", l);
}
for (;;); //Sleep (INFINITE);
}
füg einfach in deine struct SPJob einen member des typs NT_LIST_ENTRY ein, lege dir einen NT_LIST_ENTRY als listenkopf an (siehe beispiel) und schon sind deine structs 'queue-fähig'