前言:非同步執行經常要用到2個函式,乙個函式處理ui執行緒的呼叫,另外乙個函式處理核心執行緒呼叫。並且中間要用很多命令來轉接不同的函式。這樣函式的**量和處理要麻煩很多。可以用模板函式做一下轉接。
模板函式如下:(用到的函式打包知:std::bind與std::function詳解)
#pragma once
#include "stdafx.h"
#include #include #include #include #include class cperformfunction
~cqueuecmd()
{}void wait()
void notify()
void* getcmd()
public:
bool m_issync;
bool m_isdel;
private:
void* _data;
std::mutex _mutex;
std::condition_variable _cond;
bool _isfinish; //命令執行完成
};public:
cperformfunction() {}
virtual ~cperformfunction()
(*itercmd)->notify();
if (!(*itercmd)->m_issync)
}m_veccmd.clear();
auto iterdelcmd = m_vecdelcmd.begin();
while (iterdelcmd != m_vecdelcmd.end())
delete (*iterdelcmd);
m_vecdelcmd.erase(iterdelcmd);
} }templatet performstdobjectfuncwithreturn(object* object, t(__stdcall object::*method)(args...), args... args)
templatet performobjectfuncwithreturn(object* object, t (object::*method)(args...), args... args)
templatet performclosurewithreturn(std::functionclosure)
templatet performstdfuncwithreturn(t(__stdcall *method)(args...), args... args)
templatet performfuncwithreturn(t(*method)(args...), args... args)
templatevoid performstdobjectfuncwithoutreturn(object* object, void(__stdcall object::*method)(args...), args... args)
templatevoid performobjectfuncwithoutreturn(object* object, void(object::*method)(args...), args... args)
templatevoid performstdfuncwithoutreturn(void(__stdcall *method)(args...), args... args)
templatevoid performfuncwithoutreturn(void(*method)(args...), args... args)
templatevoid asyncperformstdobjectfunc(object* object, t(_stdcall object::*method)(args...), args... args)
templatevoid asyncperformobjectfunc(object* object, t(object::*method)(args...), args... args)
templatevoid asyncperformstdfunc(t(__stdcall *method)(args...), args... args)
templatevoid asyncperformfunc(t(*method)(args...), args... args)
virtual bool endperformcmd()
virtual void processcmd()
else
}auto itercmd = m_veccmd.begin();
while(itercmd != m_veccmd.end())
if (!(*itercmd)->m_issync)
(*itercmd)->notify();
itercmd=m_veccmd.erase(itercmd);
if (endperformcmd())
}}protected:
virtual void exec(std::functionfunc,bool issync=true)
while (0);
pcmd->wait();
if (issync)
else
}private:
templatevoid wrap(std::functionf, t* value)
private:
std::vectorm_veccmd; //函式呼叫命令引數
std::vectorm_vecdelcmd; //刪除命令佇列
std::mutex m_mtxcmd; //互斥量
};
如何在linux中執行乙個指令碼
如果是開機馬上執行的指令碼,可以將指令碼寫到rc.local中 如果是使用者登入後自動執行指令碼,可以將指令碼寫到相應的使用者目錄下 bash profile 若指令碼 bash profile 不存在,可以直接拷貝 etc profile 命名為 bash profile 如果是要任一使用者登入後...
如何在乙個全域性函式中獲得DOC指標
我的情況是就差最後一點完成我的設計。我主要是遇到一點問題。就是如何在乙個全域性函式中,獲得它文件類 或者是檢視類 的指標啊?這個是我的現在的問題。我在網上找到了乙個帖子。看是看了。可是看了不是很懂。現在我遇見的情況就是和這個帖子的情況是一樣的。可能是在乙個全域性函式中,獲得它doc類的指標。如在單文...
如何在shell內部定義乙個函式
定義函式 函式名 呼叫函式 函式名傳參函式格式 傳引數 函式名 引數函式體呼叫引數 函式名 注意 類似於shell內建變數中的位置引數 簡單函式定義和呼叫示例 bin bash 函式使用場景一 執行頻繁的命令 dayin dayin函式傳參和函式體內呼叫引數示例 bin bash 函式的使用場景二 ...