Я пытаюсь сделать простой асинхронный вызов с использованием C ++.Моя проблема в том, что мой код выполняет синхронизацию и использует блочные функции.Я хочу асинхронную и неблокирующую программу.
В первый раз я написал небольшой код на C ++ для проверки своей логики, поэтому программа заканчивается перед потоком, так что это не работает.Но в проекте Xcode на iOS я могу написать код C ++ без функции main
, в части «Конечная цель» подробно это описано.
#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 ++.Для этого я хочу вызвать функцию C ++ из Swift и передать функцию указателя, чтобы получить обратный вызов, когда процесс будет завершен.Чтобы начать проект, я просто написал небольшой код для вызова функции C ++ и оставил работу make в фоновом режиме, когда работа завершится обратно через функцию обратного вызова Swift.Я пока не выполняю функцию обратного вызова, прежде чем я хочу проверить асинхронные функции.
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