Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.16;
Скачать: CL | DM;

Вниз

CreateThread   Найти похожие ветки 

 
Nevmerj   (2002-03-13 13:25) [0]

Подскажите как передать число в поток

procedure mythread(P:Pointer);
begin
if p=nil then WriteLn("Error"); // почему то всегда p=nil !!! :(
end;

var param : Cardinal;

param:=10;
createThread(nil,0,@mythread,Pointer(param),0,ThId); или
createThread(nil,0,@mythread,@param,0,ThId);

Ни один из этих вариантов не работает - p=nil :( Подскажите как правильно это сделать??


 
Юрий Зотов ©   (2002-03-13 13:44) [1]

1. А почему процедура? Должна быть функция.
2. Нарушено соглашение о вызове. Нужно stdcall.

function MyThread(P: Pointer): DWORD; stdcall;


 
Shaman_Naydak ©   (2002-03-13 13:52) [2]

Если сильно хочется геморроя то,
BeginThread(nil, 0, @MyThread, @Param, 0, ThID);
вместо CreateThread"a надо использовать оболочку, чтобы потом память корректно выделялась..
Вот пример:
type
PCardinal = ^Cardinal;
function MyThread(Param: PCardinal): Integer;
var
FreeThread: Boolean;
begin
if Param = nil then
ShowMessage("nil")
else
ShowMessage(IntToStr(Param^));

EndThread(0);
end;


var P: Cardinal;

procedure TForm1.Button3Click(Sender: TObject);
var ThID: LongWord;
begin
P:=10;
BeginThread(nil, 0, @MyThread, @P, 0, ThID);
end;

А вообще-то нормальные люди класс наследуют от TThread"a
и не создают себе трудностей на ровном месте


 
VuDZ ©   (2002-03-13 17:19) [3]

Shaman_Naydak

> А вообще-то нормальные люди класс наследуют от TThread"a
> и не создают себе трудностей на ровном месте

ну-ну - из-за десяти строк кода делать класс?

void* thread(void *param){
int num = (int)param;
....
}

_beginthread (thread, 0, (void*)123);

смысл ясен?


 
Nevmerj   (2002-03-13 23:18) [4]

Проблема была в stdcall

2 Юрий Зотов
А почему процедура? Должна быть функция.
Потому, что так написано в примере в MSDN (пример не о CreateThread )


 
Shaman_Naydak ©   (2002-03-14 17:02) [5]

>> VUDZ
Код имеет мрачную способность разбухать..
и эти десять строк кода легко и без усилий вырастут в 500-700, понадобится синхронизировать чо-нидь с основным потоком, и понеслась..
Конечно, сделать самому не проблема, но зачем?

>> Nevmerj
Еще раз советую использовать оболочку BeginThread, ну или хотя бы сам присвой IsMultiThreaded:=True..
а то будешь долго искать ошибка у борланада в выделении/освобождении памяти..


 
VuDZ ©   (2002-03-14 18:08) [6]

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

А остальне 600 в классах :>


 
Юрий Зотов ©   (2002-03-14 20:50) [7]

> Nevmerj (13.03.02 23:18)

Не знаю, как насчет какого-то там примера, но и в SDK и в MSDN четко сказано, что это должна быть не процедура, а функция.

Из SDK:

lpStartAddress

The starting address of the new thread. This is typically the address of a function declared with the WINAPI calling convention that accepts a single 32-bit pointer as an argument and returns a 32-bit exit code. Its prototype is: DWORD WINAPI ThreadFunc( LPVOID );

Что на Паскале выглядит как:
function MyThread(P: Pointer): DWORD; stdcall;



Из MSDN (ThreadProc):

The function should return a value that indicates its success or failure.


 
VuDZ ©   (2002-03-15 02:32) [8]

да всё это фигня, на самом-то деле.
3/4 потоков у меня определены так:
void Dowork (void* param)
т.е. они ничего не возвращают

так же как и глвная ф-ия приложения: может быть int WinMain(), а может void WinMain()


 
Nevmerj   (2002-03-15 07:26) [9]

VOID InstanceThread(LPVOID lpvParam)

Это из примера не по потокам, но из MSDN (надеюсь они то знают, что пишут ). Я автоматом так и написал procedure..


 
paul_shmakov ©   (2002-03-15 07:33) [10]

не смотрите на дурные примеры :)
DWORD WINAPI ThreadFunc( LPVOID );

2 VuDZ:
да всё это фигня, на самом-то деле
ну зачем людей смущаешь? :)


 
VuDZ ©   (2002-03-15 07:46) [11]

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

> но из MSDN (надеюсь они то знают, что пишут ).

по большей части да, но иногда бывают такие перлы - на одной и тойже странице написано, что ф-ия поддерживается, потом в ремарках - чтонет, и в самом низу - что не поддерживается одной из платформ :(


 
paul_shmakov ©   (2002-03-15 11:25) [12]

2 VuDZ:

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

да, безусловно, на значение eax вполне можно начхать - стек не портит. но чем меньше программист (особенно начинающий) делает таких допущений с оглядкой на компилятор, тем лучше и для него и для нас.

а то они потом все начинают опускать - и возвращаемое значение, и stdcall, и даже количество параметров (!) - это мол все пережитки с/с++. :)

так что, чем строже, тем лучше. ошибок и своих хватит.


 
VuDZ ©   (2002-03-15 16:23) [13]

сорри,но я пишу на С/С++, и особо не знаю, в чем разница на Делфи у procedure & function
единственная ф-ия, возвращаемое значение которое точно нужно - GetLastError()
я в этом вопросе (портирование API -> Delphi) не очень, так что спорить не буду


 
paul_shmakov ©   (2002-03-15 20:05) [14]

да конечно разницы между procedure и function - никакой. я тоже пишу в основном на cpp, а delphi относительно слабо знаю :)

просто сегодня программер напишет void WINAPI ThreadFunc(LPVOID lpParam), а завтра здесь же будет спрашивать, почему GetExitCodeThread возвращает непонятное значение и откуда она его берет?

можно и stdcall опустить в прототипе функции и работать с переданными параметрами вручную, извлекая их из стека.

но зачем? это абсолютно необоснованные приведения типов, которые основываются при этом даже не на правилах языка, а на знании того, какой код генерирует компилятор.

чем меньше таких допусков (непозволительных, кстати) - тем лучше.


 
VuDZ ©   (2002-03-15 21:38) [15]

да можно и ООП сделать на чистом С/Паскале, а надо ли...

В общем: люди, будьте внимательны к той фигне, которую вы пишите :)



Страницы: 1 вся ветка

Текущий архив: 2002.05.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
1-49952
Serd_hhc
2002-05-04 15:01
2002.05.16
Как можноэто сделать...?


1-49994
Windeus
2002-04-30 07:38
2002.05.16
Работа с текстом.


1-50004
Ronin
2002-04-30 02:08
2002.05.16
Как добавить ссылку на сайт в hlp файле?


1-50001
handra
2002-04-30 14:50
2002.05.16
TIToolServices


3-49840
Andrew Ustinov
2002-04-19 05:58
2002.05.16
Есть ли в IB аналог Oracle-ового decode()