Search
Categories
Articles
Rainmeter関連
ファイル置き場
お知り合いなど

スポンサーサイト

--.--.-- | スポンサー広告

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Refresh

2009.08.19 | Rainmeter-dev // Issue/互換性問題やバグ修正

0 Comments

kenz0さんの投稿されたIssue97はRefreshの中身が問題なのかなーと思い、ソースを見てみました。
(ダンプファイルってどうやって使うんだろう……こういう部分も勉強しないとなぁ)

!RainmeterRefreshがBANGされると、CMeterWindow::Refresh()が引数init = falseで呼ばれます。
中身はこんな感じ。

/*
** Refresh
**
** This deletes everything and rebuilds the config again.
**
*/
void CMeterWindow::Refresh(bool init)
{
    /* snip */
 
    if(!init)
    {
        // First destroy everything
        // WriteConfig(); //Not clear why this is needed and it messes up resolution changes
 
        KillTimer(m_Window, METERTIMER);    // Kill the timer
        KillTimer(m_Window, MOUSETIMER);    // Kill the timer
        KillTimer(m_Window, FADETIMER);    // Kill the timer
 
        std::list<CMeasure*>::iterator i = m_Measures.begin();
        for( ; i != m_Measures.end(); i++)
        {
            delete (*i);
        }
        m_Measures.clear();
 
        std::list<CMeter*>::iterator j = m_Meters.begin();
        for( ; j != m_Meters.end(); j++)
        {
            delete (*j);
        }
        m_Meters.clear();
 
        if(m_Background) delete m_Background;
        m_Background = NULL;
 
        m_BackgroundSize.cx = m_BackgroundSize.cy = 0;
 
        m_BackgroundName.erase();
    }
 
    //TODO: Should these be moved to a Reload command instead of hitting the disk on every refresh
    ReadConfig();    // Read the general settings 
    ReadSkin();
 
    InitializeMeters();
 
    /* snip */
}

Refresh(false)が呼ばれると、今まで使っていたMeasureとMeterをすべて削除し、作り直しています。
作り直すこと自体には別に問題ないですが、もしこれがUpdateタイマーでの更新タイミングで(IfEqualsActionなどから)呼び出されたものなら、呼び出し元Measureもdeleteしちゃうことになります。処理を終えても、呼び出し元がdeleteされちゃってるので、たぶんクラッシュします(?)。

同じように、前回書いた解像度変更のWM_SETTINGCHANGEまわりでクラッシュするというのも、Refresh(false)が過剰に呼び出され続けるタイミングで通常のUpdateタイマーでの更新が走ってクラッシュしてるのかなぁと想像(これはスレッドセーフではないということ? )。
(メッセージキューは1つしかないから、並行して実行することはなさそうだし、原因は別かな……)

これが原因と仮定して対策をするとして……IfなんとかActionから!RainmeterRefreshが呼び出された場合はどうすりゃいいんだろう……。deleteしちゃうようなものが呼ばれると構造上きつい気がする……。

« [Rainmeter-dev] 画像のアスペクト比維持 ほか [MoE] Color Thor - 2 »

- Comments
0 Comments

管理者にだけ表示を許可する
- Trackbacks
0 Trackbacks


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。