ページ 11

Codezineで見つけたタスクシステムを実行してみた結果

Posted: 2015年6月22日(月) 21:37
by 夢幻ノ月夜
今回はCodezineで見つけたコードでタスクシステムを実行させてみたところ(大体何をしているかは分かる)
重大な穴を見つけたような気がしました
まず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が作れないんですよ
誰か自分と一緒に考えてくれる人はいませんか?

Re: Codezineで見つけたタスクシステムを実行してみた結果

Posted: 2015年6月22日(月) 23:04
by h2so5
たぶんバグだと思います。というか、タスクリスト内の最大のpriority以上のpriorityを持つタスクを追加すると無限ループになります。
いくつか修正すれば直せないことはないですが、コードを変更せずとも応急処置として最初に非常に大きい優先度の数値を持つダミーのタスクを追加すればループを回避できます。

水を差すようで悪いですが、このタスクシステムのサンプルは無駄に複雑なだけで良いものではないので参考にしないほうが良いです。
素直にstd::listとか使ったほうがいいです。

Re: Codezineで見つけたタスクシステムを実行してみた結果

Posted: 2015年6月22日(月) 23:15
by 夢幻ノ月夜
h2so5 さんが書きました:たぶんバグだと思います。というか、タスクリスト内の最大のpriority以上のpriorityを持つタスクを追加すると無限ループになります。
いくつか修正すれば直せないことはないですが、コードを変更せずとも応急処置として最初に非常に大きい優先度の数値を持つダミーのタスクを追加すればループを回避できます。

水を差すようで悪いですが、このタスクシステムのサンプルは無駄に複雑なだけで良いものではないので参考にしないほうが良いです。
素直にstd::listとか使ったほうがいいです。
ダミー作戦決行してみます
std::listってサイズ可変でしたっけ?

Re: Codezineで見つけたタスクシステムを実行してみた結果

Posted: 2015年6月22日(月) 23:47
by h2so5
std::listはサイズ可変です。std::sortと組み合わせれば優先度でソートできます。

Re: Codezineで見つけたタスクシステムを実行してみた結果

Posted: 2015年6月25日(木) 19:25
by 夢幻ノ月夜
h2so5 さんが書きました:std::listはサイズ可変です。std::sortと組み合わせれば優先度でソートできます。
ありがとうございます
それ使いますわ