C++ Simple thread with parameter (no .net)

Posted by Marc Vollmer on Stack Overflow See other posts from Stack Overflow or by Marc Vollmer
Published on 2012-09-01T21:34:36Z Indexed on 2012/09/01 21:38 UTC
Read the original article Hit count: 178

Filed under:
|
|
|
|

I've searched the internet for a while now and found different solutions but then all don't really work or are to complicated for my use. I used C++ until 2 years ago so it might be a bit rusty :D

I'm currently writing a program that posts data to an URL. It only posts the data nothing else. For posting the data I use curl, but it blocks the main thread and while the first post is still running there will be a second post that should start. In the end there are about 5-6 post operations running at the same time.

Now I want to push the posting with curl into another thread. One thread per post. The thread should get a string parameter with the content what to push.

I'm currently stuck on this. Tried the WINAPI for windows but that crashes on reading the parameter. (the second thread is still running in my example while the main thread ended (waiting on system("pause")).

It would be nice to have a multi plattform solution, because it will run under windows and linux!

Heres my current code:

#define CURL_STATICLIB
#include <curl/curl.h>
#include <curl/easy.h>
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#if defined(WIN32)
    #include <windows.h>
#else
    //#include <pthread.h>
#endif

using namespace std;

void post(string post) { // Function to post it to url
    CURL *curl; // curl object
    CURLcode res; // CURLcode object
    curl = curl_easy_init(); // init curl
    if(curl) { // is curl init
        curl_easy_setopt(curl, CURLOPT_URL, "http://10.8.27.101/api.aspx"); // set url
        string data = "api=" + post; // concat post data strings
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str()); // post data
        res = curl_easy_perform(curl); // execute
        curl_easy_cleanup(curl); // cleanup
    } else {
        cerr << "Failed to create curl handle!\n";
    }
}

#if defined(WIN32)
    DWORD WINAPI thread(LPVOID data) { // WINAPI Thread
        string pData = *((string*)data); // convert LPVOID to string [THIS FAILES]
        post(pData); // post it with curl
    }
#else
    // Linux version
#endif

void startThread(string data) { // FUnction to start the thread
    string pData = data; // some Test
    #if defined(WIN32)
        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread, &pData, 0, NULL); // Start a Windows thread with winapi
    #else
        // Linux version
    #endif
}

int main(int argc, char *argv[]) {
    // The post data to send
    string postData = "test1234567890";
    startThread(postData); // Start the thread
    system("PAUSE"); // Dont close the console window
    return EXIT_SUCCESS;
}

Has anyone a suggestion?

Thanks for the help!

© Stack Overflow or respective owner

Related posts about c++

Related posts about Windows