Многопоточность в 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);
}
Синтаксис работал нормально для классов, на которые нет ссылок.