Как сделать функцию асинхронного вызова на C ++, используя потоки, вызываемые из кода Swift? - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь сделать простой асинхронный вызов с использованием 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

1 Ответ

0 голосов
/ 31 марта 2019

Вот как это можно сделать, используя 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();
    }
};

Swift

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...