![]() |
|
#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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 09.08.2011 в 22:02. |
#6
|
|||
|
|||
![]() Премного благодарен за ответы. Изначально я догадывался что нужно что то в uses дописать но лучше спросить у профессионалов.
Еще такой вопрос. У меня программа в потоке посылает на сервер всякие запросы типа get, post, а в ответ я получаю данные которые в дальнейшем обрабатываются и выводятся в memo, как мне сделать так что бы memo не зависал при работе? Нужно все что должно отправиться на экран, то есть в memo выводить используя Synchronize? |
#7
|
|||
|
|||
![]() Ааа....все) с этим разобрался. Теперь другая проблема, как сделать много потоков. У меня есть идея которую я не знаю как реализовать. В общем есть файл, там к примеру 15000 аккаунтов, для корректной роботы и с учетом времени нужно что бы все аккаунты за пол часа были использованы, но в один поток за пол часа проходит только 500 аккаунтов и теперь задумка. Нужно количество аккаунтов в файле делить на 500 и создавать столько потоков сколько выйдет в результате деления, в конкретном случае 30. Помогите это организовать, я совсем не понимаю как так сделать. Нужно ли в ручную создавать столько потоков, а потом просто вызывать их в нужном количестве или может можно создать один но что бы он запустился n-ное количество раз?
|
#8
|
||||
|
||||
![]() Это уже "попахивает" спамерством, а это другая тема и здесь я не помощник.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#9
|
|||
|
|||
![]() Спам здесь не причем я таким не занимаюсь и аккаунтов не 15000 само собой.
Просто нужно периодически заходить на сайт вот и все. Может все таки поможешь? Ну или хотя бы идейку, а я потом сам посижу подумаю если не веришь мне. |
#10
|
||||
|
||||
![]() 500 это, конечно, перебор, десятка должно хватить. А вот как создавать, это уже дело программиста.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#11
|
|||
|
|||
![]() Так как правильней будет?
Писать руками код для всех потоков, а потом просто вызывать сколько нужно будет? |
#12
|
||||
|
||||
![]() Но ведь "поток" в Дельфи это класс, ну и создавай сколько нужно экземпляров. А ещё лучше, создай "наследника", и пропиши в нём нужные действия.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |