欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊: 次

前言

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

比如,有人提供一個類庫 AfCopyFile,能夠提供文件拷貝的功能,而且能通知用戶當前的進度。。。

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)機制的缺點:

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

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

我們應盡量避免使用回調(diào)機制,最好采用單向的函數(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);

 // 打印進度
 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)
 {
  // 打印進度
  int percent = (int) ( (transfered * 100 / total) );  
  printf("[用戶: %s], %s -> %s : 進度 %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)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支持。

上一篇:C語言菜鳥基礎(chǔ)教程之Hello World

欄    目:C語言

下一篇:c語言printf實現(xiàn)同一位置打印輸出的實例

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

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1139.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有