重大な穴を見つけたような気がしました
まずCodezineの方のリンク貼っておきますね つhttp://codezine.jp/article/detail/297
そして見つけた穴っていうのが
「最初に同じ優先度のタスクを二連続で追加しようとすると固まる」です
動作をチェックして見た限り
オーバーライドされたnewの中でやっている処理に穴があるようで
「タスクリストが空ではないときに
元から入っていたタスクの優先度が全て今追加したい
タスクの優先度と等しいときに末尾に追加する処理が見つからない」んですよ
// タスクの生成・追加
// タスクは優先度の値が小さい順につなげる
void* Task::operator new(size_t size,float priority)
{
if(g_buf==NULL) return NULL; // タスクリストが初期化されていない
if(m_free+size >= g_buf+MEM_SIZE) return NULL; // 空き容量不足
g_size+=(DWORD)size;
g_count++;
Task *new_task=(Task*)m_free;
m_free+=size;
if(m_active==NULL) // 現在タスクリストは空
{
m_active=(BYTE*)new_task;
new_task->m_use = TRUE;
new_task->m_size = (DWORD)size;
new_task->m_pre = new_task;
new_task->m_next = new_task;
new_task->m_priority = priority;
return new_task;
}
// タスクリストに挿入する
Task *task,*next;
for(task=(Task*)m_active;;task=next)
{
next=task->m_next;
if( priority < task->m_priority ) // 同じ優先度なら末尾に挿入←ここで穴があると予想
{
if(task==(Task*)m_active) // 先頭に挿入
{
m_active=(BYTE*)new_task;
}
new_task->m_pre = task->m_pre;
new_task->m_next = task;
break;
}
/*if(next==(Task*)m_active){//←この辺は自分で考えて入れてみたものの予期しない動作しかしませんでした(´・ω・`)
new_task->m_pre = task->m_pre;
new_task->m_next = task;
break;
}*/
}
new_task->m_use = TRUE;
new_task->m_size = (DWORD)size;
new_task->m_priority = priority;
new_task->m_pre->m_next = new_task;
new_task->m_next->m_pre = new_task;
return new_task;
}
原因を見つけるためにかなり苦労しましたがこれどうやったら解決すると思いますか?
これが解決できないと今作っているSTGが作れないんですよ
誰か自分と一緒に考えてくれる人はいませんか?