我正在尝试使用C ++进行简单的异步调用。我的问题是我的代码执行同步并使用块函数。我想要一个异步且非阻塞的程序。
第一次,我用C ++写了一点代码来测试我的逻辑,所以程序在线程之前结束,所以这行不通。但是在iOS项目的Xcode上,我可以不用main
函数来编写C ++代码,在“最终目标”部分对此进行了详细说明。
#include <iostream>
#include <string>
#include <chrono>
#include <future>
using namespace std;
void call_from_async()
{
std::this_thread::sleep_for(std::chrono::seconds(5));
cout << "Async call" << endl;
}
int main(void) {
printf("1\n");
std::future<void> fut = std::async(std::launch::async, call_from_async);
// std::async(std::launch::async,call_from_async);
printf("2\n");
return 0;
}
输出:
1
2
所需的输出:
1
2
Async Call
最终目标
我有一个Swift项目,必须调用C ++异步函数。为此,我想从Swift调用C ++函数,并传递一个指针函数以在过程完成后获取回调。为了开始这个项目,我只写了一些代码来调用C ++函数,并在工作完成后通过回调函数返回Swift时将工作置于后台。在测试异步功能之前,我还没有回调函数。
快捷代码
// ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
printFromCPP()
print("1")
call_async_function()
print("2")
}
}
// Ex_iOS_CPP_Swift-Bridging-Header.h
#ifdef __cplusplus
extern "C" {
#endif
#include "Foo.h"
#ifdef __cplusplus
}
#endif
// Foo.h
#ifndef Foo_h
#define Foo_h
void printFromCPP();
void call_async_function();
#endif /* Foo_h */
// Foo.cpp
#include <iostream>
#include <future>
#include <unistd.h>
#include "Ex_iOS_CPP_Swift-Bridging-Header.h"
using namespace std;
void called_from_async() {
sleep(3);
cout << "Async call" << endl;
}
void call_async_function() {
// std::future<void> fut = std::async(std::launch::async, called_from_async);
std::future<void> result( std::async(called_from_async));
}
void printFromCPP() {
cout << "Hello World from CPP" << endl;
}
输出
Hello World from CPP
1
Async call
2
所需的输出
Hello World from CPP
1
2
Async call
答案 0 :(得分:1)
这是使用Scapix Language Bridge来完成的方法:
C ++
#include <thread>
#include <iostream>
#include <scapix/bridge/object.h>
class cpp_class : public scapix::bridge::object<cpp_class>
{
public:
void async(std::function<void(std::string)> callback)
{
std::thread([=]{
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << "cpp_class::async\n";
callback("cpp_class::async -> success");
}).detach();
}
};
迅速
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let cpp = CppClass()
cpp.async() {
(result: String) in
print("Swift: " + result)
}
}
}
此打印:
cpp_class::async
Swift: cpp_class::async -> success