非同步執行如何在乙個函式中實現

2021-08-20 10:20:44 字數 2799 閱讀 1579

前言:非同步執行經常要用到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 函式的使用場景二 ...