Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2011, 00:16   #1
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
Счастье Запустить поток передав ему переменную

Делаю так:
var Tid: LongWord;

function Thread(Data: Pointer; var CleaningSection: TStringList): Integer;
begin
//Делаю что-то с полученной переменной CleaningSection
end;

BeginThread(nil,0,Thread(*Сюда по моему предположению нужно указать название стринг листа, другого варианта я не знаю*),nil,0,Tid); //Где-то там запускаю поток

Собственно сабж: как мне передать имя стринг листа?

З.Ы. По быдлокодерски не хочется добавлять глобальную переменную и до запуска потока присваивать ей значение.
Возможно Я Быдлокодер ©.

Последний раз редактировалось t2skler; 08.02.2011 в 00:26.
t2skler вне форума Ответить с цитированием
Старый 08.02.2011, 01:22   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
function ThreadProc(CleaningSection: TStringList): Integer;
begin
  // Делаю что-то с полученной переменной CleaningSection
end;

BeginThread(nil, 0, @ThreadProc, Pointer(myStringList), 0, Tid);
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.02.2011, 15:19   #3
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Код:
function ThreadProc(CleaningSection: TStringList): Integer;
begin
  // Делаю что-то с полученной переменной CleaningSection
end;

BeginThread(nil, 0, @ThreadProc, Pointer(myStringList), 0, Tid);
Происходит ошибка, т.к. потоку нужно передавать переменную типа поинтер.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 08.02.2011, 15:54   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> ошибка, т.к. потоку нужно передавать переменную типа поинтер.

А это

BeginThread(nil, 0, @ThreadProc, Pointer(myStringList), 0, Tid);

что по-твоему ?
Это не "типа пойнтер", надо понимать ?)
mss вне форума Ответить с цитированием
Старый 08.02.2011, 18:19   #5
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
> ошибка, т.к. потоку нужно передавать переменную типа поинтер.

А это

BeginThread(nil, 0, @ThreadProc, Pointer(myStringList), 0, Tid);

что по-твоему ?
Это не "типа пойнтер", надо понимать ?)
Да я ошибся, в функции потока должна быть объявлена переменная типа поинтер, а передавая ему Pointer(myStringList) это не то, что нужно)

Вот такая ошибка при запуске потока:
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 08.02.2011, 18:32   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Происходит ошибка

это зависит от опций компилятора, но вот более универсальный вариант:

Код:
function ThreadProc(param: Pointer): Integer;
var
  CleaningSection: TStringList absolute param;
begin
 // Делаю что-то с полученной переменной CleaningSection
end;

BeginThread(nil, 0, ThreadProc, Pointer(myStringList), 0, tid);

> в функции потока должна быть объявлена переменная типа поинтер

зачем?

> а передавая ему Pointer(myStringList) это не то, что нужно)

а что вам нужно?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.02.2011, 18:38   #7
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
> Происходит ошибка

это зависит от опций компилятора, но вот более универсальный вариант:

Код:
function ThreadProc(param: Pointer): Integer;
var
  CleaningSection: TStringList absolute param;
begin
 // Делаю что-то с полученной переменной CleaningSection
end;

BeginThread(nil, 0, ThreadProc, Pointer(myStringList), 0, tid);

> в функции потока должна быть объявлена переменная типа поинтер

зачем?

> а передавая ему Pointer(myStringList) это не то, что нужно)

а что вам нужно?
мне нужно передать потоку переменную типа TStringList, а точнее её имя, т.к. это имя используется уже в самом потоке.

function Thread(Data: Pointer; {Переменная типа поинтер обязательна нужна в потоке} NameSL: TStringList {Имя этой переменной мы должны получить при запуске потока}): Integer;
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 08.02.2011, 18:41   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
мне нужно передать потоку переменную типа TStringList, а точнее её имя, т.к. это имя используется уже в самом потоке.
Ты сам-то понял, что сказал? Как это передать имя? В программе никаких имён не существует. Есть только байты. И передать ты можешь только байты. Т.е. или саму переменную или указатель на неё. Но никак не имя.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 08.02.2011, 18:41   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от t2skler Посмотреть сообщение
Вот такая ошибка при запуске потока:
Эта ошибка не имеет никакого отношения к запуску потока.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 08.02.2011, 18:42   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы попробуйте сначало.

причем тут имя? у переменной нет понятия имя.(в итоговой сборке)

объекты всегда передаются по указателю.
то есть в коде вы передадите не сам объект, а лишь указатель на него.

Код:
function Thread(Data: Pointer; {Переменная типа поинтер обязательна нужна в потоке} NameSL: TStringList {Имя этой переменной мы должны получить при запуске потока}):
нельзя приписать параметр.
но можно использовать Data что у вас есть(он для подобного и создан)

кстати вопрос: а почему именно потоки на API?чем не угодил TThread?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 08.02.2011 в 18:44.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не понятно что ему не нравится _ILYA_ Visual C++ 3 29.10.2010 20:25
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
Поток выполняется или прерван - нельзя запустить повторно boris-blade Общие вопросы .NET 0 02.04.2010 18:16
Передать переменную в поток,туплю. larin1974 Помощь студентам 2 20.11.2009 05:25
Как остановить поток а потом снова запустить? Des Общие вопросы Delphi 5 03.05.2009 12:35