Многопоточность в C++ с использованием ссылочных классов - проблемы с конструктором ThreadStart?

Я ценю любую помощь, и хотел бы поблагодарить вас заранее. Я работаю над проектом для одного из моих классов. По сути, выполняет сортировку слиянием с использованием многопоточности и ссылочных классов. В основном я просто пытаюсь создать начальный поток, который начнет рекурсивную сортировку слиянием. Каждый раз, когда массив разбивается, создается новый поток для обработки этой подпрограммы. Мне не нужно все это делать, я просто не понимаю, почему мой конструктор Thread и делегат ThreadStart не работают. Еще раз спасибо!!

#include <iostream>
#include <vector>
#include <string>
#include <time.h>
#include <cstdlib>

using namespace System;
using namespace System::Threading;

public ref class MergeSort 
{
    private: int cnt;

    public: MergeSort() 
    {
        cnt = 0;
    }

    public: void mergeSort(char a[], int from, int to)
    {
        Thread^ current = Thread::CurrentThread;

        if(from == to)
            return;
        int mid = (from + to)/2;

        //Sort the first and the second half
        //addThread(a, from, mid);
        //addThread(a, mid+1, to);

        //threads[0]->Join();
        //threads[1]->Join();

        merge(a, from, mid, to);
    }

    public: void merge(char a[], int from, int mid, int to)
    {           
            Thread^ current = Thread::CurrentThread;
            while (current ->ThreadState == ThreadState::Running)
            {
                    int n = to-from + 1; // Size of range to be merged
                    std::vector<char> b(n);

                    int i1 = from; //Next element to consider in the first half
                    int i2 = mid + 1; //Next element to consider in the second half
                    int j = 0; //Next open position in b

                    //As long as neight i1 or i2 is past the end, move the smaller element into b
                    while(i1 <= mid && i2 <= to)
                    {
                        if(a[i1] < a[i2])
                        {
                            b[j] = a[i1];
                            i1++;
                        }
                        else
                        {
                            b[j] = a[i2];
                            i2++;
                        }
                        j++;
                    }

                    //Copy any remaining entries of the first half
                    while(i1 <= mid)
                    {
                        b[j] = a[i1];
                        i1++;
                        j++;
                    }
                    while(i2 <= to)
                    {
                        b[j] = a[i2];
                        i2++;
                        j++;
                    }

                    //Copy back from temporary vector
                    for(j = 0; j < n; j++)
                        a[from+j] = b[j];
            }       
    }
};


void main()
{
    char A[10];

    for(int i = 0; i < 10; i++)
    {
        A[i] = ((char) ((rand() % (122-65)) + 65));
    }

    array<Thread^>^ tr = gcnew array<Thread^>(10);

    MergeSort^ ms1 = gcnew MergeSort();

    ThreadStart^ TS = gcnew ThreadStart(ms1, &MergeSort::mergeSort(A, 0, 10));
    tr[0] = gcnew Thread(TS);
    tr[0] -> Start();

    system("pause");
}

1 ответ

Решение

Проблема, с которой вы здесь сталкиваетесь, заключается в том, как построить ThreadStart делегировать. Вы пытаетесь сделать слишком много вещей в ThreadStart конструктор. Вы не можете передать аргументы на этом этапе, потому что все, что он ищет, - это начальное местоположение потока.

Делегат должен быть:

ThreadStart^ TS = gcnew ThreadStart(ms1, &MergeSort::mergeSort);

Так как вы переходите в какое-то состояние, я бы порекомендовал немного больше изучить, как это сделать с помощью C++\CLI. Эта тема MSDN должна дать вам начало.

Редактировать:

Неважно, проблема была в том, что мне пришлось изменить параметр метода, который я пытался передать с Int32 на Object^.

У меня похожая проблема, хотя я думаю, что моя проблема не в аргументах. Я передаю их во время thread->Start(),

Я думаю, что моя проблема скорее в том, что я пытаюсь запустить поток, используя метод класса ref.

неверный инициализатор делегата - функция не соответствует типу делегата

Это ошибка, которую я получаю. Есть идеи?

void AddForcesAll() {
    for (int index = 0; index < n; index++) {
        Thread^ thread = gcnew Thread (gcnew ParameterizedThreadStart(this, &Bodies::AddForces));
        thread->Start(index);
    }

Синтаксис работал нормально для классов, на которые нет ссылок.

Другие вопросы по тегам