最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中如何實現(xiàn)回調(diào)的方法示例

 更新時間:2017年10月06日 11:36:07   作者:NiceBlueChai  
這篇文章主要給大家介紹了關(guān)于C++中如何實現(xiàn)回調(diào)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

C++中使用class語法實現(xiàn)回調(diào)(當(dāng)然,,舊式的C函數(shù)指針回調(diào)也是支持的)

比如,有人提供一個類庫 AfCopyFile,能夠提供文件拷貝的功能,而且能通知用戶當(dāng)前的進(jìn)度。。。

int DoCopy(const char* source,
const char* dst,
AfCopyFileListener* listener);

用戶只需要自己實現(xiàn)一個AfCopyFileListener對象,傳給這個函數(shù)就行。。。

class MainJob : public AfCopyFileListener{
int OnCopyProgress(long long total,
long long transfered){
 }
}

把Listener對象傳過去

AfCopyFile af;
af.DoCopy(source, dst, this); 

回調(diào)機(jī)制的缺點:

無論是C語言的回調(diào)函數(shù),還是C++里的Listener,都有一個共同的缺點:

它使代碼邏輯變得難以閱讀。。

我們應(yīng)盡量避免使用回調(diào)機(jī)制,最好采用單向的函數(shù)調(diào)用。

示例代碼:

AfCopyFile.h

#ifndef _AF_COPY_FILE_H
#define _AF_COPY_FILE_H

class AfCopyFile
{
public:
 // 作為內(nèi)部類
 class Listener
 {
 public:
  virtual int OnCopyProgress(long long total, long long transfered) = 0;
 };

public:
 int DoCopy(const char* source, const char* dst, Listener* listener);

};

#endif

AfCopyFile.cpp

#include <stdio.h>
#include <Windows.h>

#include "AfCopyFile.h"


// 將LARGE_INTTEGER類型轉(zhuǎn)成unsigned long long
inline unsigned long long translate(LARGE_INTEGER num)
{
 unsigned long long result = num.HighPart;
 result <<= 32;
 result += num.LowPart;
 return result;
}

// 回調(diào)函數(shù)
// 注:要求將此函數(shù)用關(guān)鍵字CALLBACK修飾(這是Windows API的要求)
static DWORD CALLBACK CopyProgress( 
       LARGE_INTEGER TotalFileSize,
       LARGE_INTEGER TotalBytesTransferred,
       LARGE_INTEGER StreamSize,
       LARGE_INTEGER StreamBytesTransferred,
       DWORD dwStreamNumber,
       DWORD dwCallbackReason,
       HANDLE hSourceFile,
       HANDLE hDestinationFile,
       LPVOID lpData) // <- 這個就是上下文件對象
{
 // 計算百分比
 unsigned long long total = translate(TotalFileSize);
 unsigned long long copied = translate(TotalBytesTransferred);

 // 打印進(jìn)度
 AfCopyFile::Listener* listener = (AfCopyFile::Listener*) lpData;
 listener->OnCopyProgress(total, copied);

 return PROGRESS_CONTINUE;
}

int AfCopyFile::DoCopy(const char* source, const char* dst, Listener* listener)
{
 BOOL ret = CopyFileEx(source, dst,
  &CopyProgress, // 待回調(diào)的函數(shù)
  listener,  // 上下文對象
  NULL, 0);
 
 return ret ? 0 : -1;
}

main.cpp

#include <stdio.h>
#include <string.h>
#include "AfCopyFile.h"

class MainJob : public AfCopyFile::Listener
{
public:
 int DoJob()
 {
  strcpy(user, "shaofa");
  strcpy(source, "c:\\test\\2.rmvb" );
  strcpy(dst, "c:\\test\\2_copy.rmvb");

  AfCopyFile af;
  af.DoCopy(source, dst, this); // 將this傳過去
 
  return 0;
 }

 int OnCopyProgress(long long total, long long transfered)
 {
  // 打印進(jìn)度
  int percent = (int) ( (transfered * 100 / total) );  
  printf("[用戶: %s], %s -> %s : 進(jìn)度 %d %%\n", 
   user, source, dst, percent);

  return 0;
 }

private:
 char source[256];
 char dst[256];
 char user[64];
};

int main()
{
 MainJob job;
 job.DoJob();

 return 0;
}

總結(jié)

以上就是這篇文章的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • c++11中的noexcept關(guān)鍵字

    c++11中的noexcept關(guān)鍵字

    這篇文章主要介紹了c++11中的noexcept關(guān)鍵字,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • VC中BASE64編碼和解碼使用詳解

    VC中BASE64編碼和解碼使用詳解

    Base64是一種很常用的編碼方式,利用它可以將任何二進(jìn)制的字符編碼到可打印的64個字符之中, 這樣,不管是圖片,中文文本等都可以編碼成只有ASCII的純文本。
    2015-11-11
  • C++算法計時器的實現(xiàn)示例

    C++算法計時器的實現(xiàn)示例

    本文主要介紹了C++算法計時器的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C語言數(shù)據(jù)結(jié)構(gòu)哈希表詳解

    C語言數(shù)據(jù)結(jié)構(gòu)哈希表詳解

    哈希表是一種根據(jù)關(guān)鍵碼去尋找值的數(shù)據(jù)映射結(jié)構(gòu),該結(jié)構(gòu)通過把關(guān)鍵碼映射的位置去尋找存放值的地方,說起來可能感覺有點復(fù)雜,我想我舉個例子你就會明白了,最典型的的例子就是字典
    2022-02-02
  • C語言數(shù)據(jù)結(jié)構(gòu)之雙向循環(huán)鏈表的實例

    C語言數(shù)據(jù)結(jié)構(gòu)之雙向循環(huán)鏈表的實例

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之雙向循環(huán)鏈表的實例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語言中設(shè)置進(jìn)程優(yōu)先順序的方法

    C語言中設(shè)置進(jìn)程優(yōu)先順序的方法

    這篇文章主要介紹了C語言中設(shè)置進(jìn)程優(yōu)先順序的方法,包括setpriority()函數(shù)和getpriority()函數(shù)以及nice()函數(shù),需要的朋友可以參考下
    2015-08-08
  • C++ Eigen庫計算矩陣特征值及特征向量

    C++ Eigen庫計算矩陣特征值及特征向量

    這篇文章主要為大家詳細(xì)介紹了C++ Eigen庫計算矩陣特征值及特征向量,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C語言代碼實現(xiàn)猜數(shù)字

    C語言代碼實現(xiàn)猜數(shù)字

    這篇文章主要為大家詳細(xì)介紹了C語言代碼實現(xiàn)猜數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++ 三種繼承方式及好處示例詳解

    C++ 三種繼承方式及好處示例詳解

    這篇文章主要為大家介紹了C++ 三種繼承方式及好處示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • C++ 字符串string和整數(shù)int的互相轉(zhuǎn)化操作

    C++ 字符串string和整數(shù)int的互相轉(zhuǎn)化操作

    這篇文章主要介紹了C++ 字符串string和整數(shù)int的互相轉(zhuǎn)化操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

磐安县| 津南区| 平江县| 临朐县| 策勒县| 南郑县| 新竹县| 梅河口市| 通城县| 石屏县| 尚义县| 孟连| 泰州市| 汽车| 建宁县| 梁平县| 紫阳县| 尼玛县| 巴楚县| 盐源县| 洛扎县| 浦县| 澄江县| 白银市| 青铜峡市| 蕉岭县| 兴宁市| 河北区| 淅川县| 汉中市| 炉霍县| 晋州市| 咸宁市| 湟中县| 梓潼县| 大余县| 霍林郭勒市| 西畴县| 卢氏县| 泽普县| 高尔夫|