Вызов функции с параметрами в отдельном потоке.

rigorMortis
Дата: 17.03.2015 23:10:21
Привет
Вызываю target_method(wstring[], int) с параметрами через функцию-оболочку execute_shell(const LPVOID), но почему-то не все параметры доходят непустыми: Значения массива содержат в себе "":


typedef struct ExecuteParameters1 
{
	wstring args[10];
	int argsCount = 0;
};


ExecuteParameters1 params;
params.args[0] = L"str";      //присваиваем значение элементу массива       
params.argsCount = argsCount;

HANDLE handle_of_comp = CreateThread(NULL, 0, execute_shell, &params, 0, NULL);


В функции-оболочке элемент массива args[0] имеет значение L"":

DWORD WINAPI execute_shell(const LPVOID lpParam)
{
	ExecuteParameters1 params = *(ExecuteParameters1*)lpParam;

	wstring t = params.args[0];  //здесь t = L"";
	int g = params.argsCount;    //g = 10 как и передавалось

	target_method(params.args, params.argsCount);
	return 0;
}


Почему такое может быть?
rigorMortis
Дата: 17.03.2015 23:26:02
Так что ли?

ExecuteParameters1 *params = new ExecuteParameters1();
Dimitry Sibiryakov
Дата: 17.03.2015 23:48:30

rigorMortis
Почему такое может быть?

params выходит из области видимости и умирает раньше, чем поток доберётся до его чтения. В
результате он читает случайный мусор в чужом участке памяти. Радуйся, что не получаешь AV.
И, кстати, CreateThread использовать не надо. Надо использовать _beginthreadex.

Posted via ActualForum NNTP Server 1.5

rigorMortis
Дата: 17.03.2015 23:58:30
Dimitry Sibiryakov

params выходит из области видимости и умирает раньше, чем поток доберётся до его чтения. В
результате он читает случайный мусор в чужом участке памяти.


Но вторая переменная int содержит то что передали, так что params не умерла. Она находится в вызывающем главном потоке.
Dimitry Sibiryakov
И, кстати, CreateThread использовать не надо. Надо использовать _beginthreadex.

А что так?
Изопропил
Дата: 18.03.2015 00:05:03
rigorMortis
А что так?

рантайм корректно в этом случае инициализируется
https://msdn.microsoft.com/library/windows/desktop/ms682453.aspx
Dimitry Sibiryakov
Дата: 18.03.2015 00:14:16

rigorMortis
Но вторая переменная int содержит то что передали

Знаешь, как говорят: "дуракам везёт".

Запомни: потоки запускаются довольно медленно. Функция, которая их запускает, обычно
успевает завершиться задолго до того, как начнёт выполняться код потока.

Posted via ActualForum NNTP Server 1.5

rigorMortis
Дата: 18.03.2015 00:19:48
Dimitry Sibiryakov
rigorMortis
Но вторая переменная int содержит то что передали

Знаешь, как говорят: "дуракам везёт".

Запомни: потоки запускаются довольно медленно. Функция, которая их запускает, обычно
успевает завершиться задолго до того, как начнёт выполняться код потока.


Я уже писал, params находится в вызывающем главном потоке. Он не завершается. И везение здесь ни при чём.
Anatoly Moskovsky
Дата: 18.03.2015 00:28:48
rigorMortis
Я уже писал, params находится в вызывающем главном потоке. Он не завершается. И везение здесь ни при чём.

А где вам говорили что поток завершается?
Было сказано "Функция, которая их запускает".

Приведите код функции лучше, а не обрывки.
Dima T
Дата: 18.03.2015 06:46:49
Воткни после CreateThread()
Sleep(100);

А по хорошему синхронизироваться через эвент или мьютекс.
Dima T
Дата: 18.03.2015 06:57:39
rigorMortis, почитай 16671612