![]() |
|
|
#1
|
|||
|
|||
|
Сел учить потоки и в самом начале возникла проблема. Вот пример с книжки:
Форма: Код:
procedure TForm1.Button1Click(Sender: TObject); begin co:=TCountObj.Create(true); co.Resume; co.Priority:=tpLower; end; procedure TForm1.Button2Click(Sender: TObject); begin co.Terminate; end; Код:
procedure TCountObj.Execute;
begin
FreeOnTerminate:=true;
index:=1;
while index>0 do
begin
Synchronize(UpdateLabel);
Inc(index);
if index>100000 then
index:=0;
if terminated then
exit;
end;
end;
procedure TCountObj.UpdateLabel;
begin
Form1.Label1.Caption:=inttostr(index);
end;Проблема в том что в потоке не работает inttostr. Пишет Undecleared identifier 'inttostr'. Использую Delphi 2010. С чем это может быть связано? |
|
#2
|
||||
|
||||
|
SysUtils добавь в блок uses
|
|
#3
|
||||
|
||||
|
или:
Код:
procedure CvtInt;
{ IN:
EAX: The integer value to be converted to text
ESI: Ptr to the right-hand side of the output buffer: LEA ESI, StrBuf[16]
ECX: Base for conversion: 0 for signed decimal, 10 or 16 for unsigned
EDX: Precision: zero padded minimum field width
OUT:
ESI: Ptr to start of converted text (not start of buffer)
ECX: Length of converted text
}
asm
OR CL,CL
JNZ @CvtLoop
@C1: OR EAX,EAX
JNS @C2
NEG EAX
CALL @C2
MOV AL,'-'
INC ECX
DEC ESI
MOV [ESI],AL
RET
@C2: MOV ECX,10
@CvtLoop:
PUSH EDX
PUSH ESI
@D1: XOR EDX,EDX
DIV ECX
DEC ESI
ADD DL,'0'
CMP DL,'0'+10
JB @D2
ADD DL,('A'-'0')-10
@D2: MOV [ESI],DL
OR EAX,EAX
JNE @D1
POP ECX
POP EDX
SUB ECX,ESI
SUB EDX,ECX
JBE @D5
ADD ECX,EDX
MOV AL,'0'
SUB ESI,EDX
JMP @z
@zloop: MOV [ESI+EDX],AL
@z: DEC EDX
JNZ @zloop
MOV [ESI],AL
@D5:
end;
function IntToStr(Value: Integer): string;
// FmtStr(Result, '%d', [Value]);
asm
PUSH ESI
MOV ESI, ESP
SUB ESP, 16
XOR ECX, ECX // base: 0 for signed decimal
PUSH EDX // result ptr
XOR EDX, EDX // zero filled field width: 0 for no leading zeros
CALL CvtInt
MOV EDX, ESI
POP EAX // result ptr
CALL System.@LStrFromPCharLen
ADD ESP, 16
POP ESI
end;![]() |
|
#4
|
||||
|
||||
|
Цитата:
........................................... |
|
#5
|
||||
|
||||
|
Цитата:
, Паскалевский способ уже не подходит?Код:
function IntToStr(I : Integer) : String; var St : String[31]; begin Str(I, St); Result := String(St); end; Последний раз редактировалось angvelem, 09.08.2011 в 22:02. |
|
#6
|
|||
|
|||
|
Премного благодарен за ответы. Изначально я догадывался что нужно что то в uses дописать но лучше спросить у профессионалов.
Еще такой вопрос. У меня программа в потоке посылает на сервер всякие запросы типа get, post, а в ответ я получаю данные которые в дальнейшем обрабатываются и выводятся в memo, как мне сделать так что бы memo не зависал при работе? Нужно все что должно отправиться на экран, то есть в memo выводить используя Synchronize? |
|
#7
|
|||
|
|||
|
Ааа....все) с этим разобрался. Теперь другая проблема, как сделать много потоков. У меня есть идея которую я не знаю как реализовать. В общем есть файл, там к примеру 15000 аккаунтов, для корректной роботы и с учетом времени нужно что бы все аккаунты за пол часа были использованы, но в один поток за пол часа проходит только 500 аккаунтов и теперь задумка. Нужно количество аккаунтов в файле делить на 500 и создавать столько потоков сколько выйдет в результате деления, в конкретном случае 30. Помогите это организовать, я совсем не понимаю как так сделать. Нужно ли в ручную создавать столько потоков, а потом просто вызывать их в нужном количестве или может можно создать один но что бы он запустился n-ное количество раз?
|
|
#8
|
||||
|
||||
|
Это уже "попахивает" спамерством, а это другая тема и здесь я не помощник.
|
|
#9
|
|||
|
|||
|
Спам здесь не причем я таким не занимаюсь и аккаунтов не 15000 само собой.
Просто нужно периодически заходить на сайт вот и все. Может все таки поможешь? Ну или хотя бы идейку, а я потом сам посижу подумаю если не веришь мне. |
|
#10
|
||||
|
||||
|
500 это, конечно, перебор, десятка должно хватить. А вот как создавать, это уже дело программиста.
|
|
#11
|
|||
|
|||
|
Так как правильней будет?
Писать руками код для всех потоков, а потом просто вызывать сколько нужно будет? |
|
#12
|
||||
|
||||
|
Но ведь "поток" в Дельфи это класс, ну и создавай сколько нужно экземпляров. А ещё лучше, создай "наследника", и пропиши в нём нужные действия.
|