Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 1
1

После старта потока файл начинает загружаться, после чего поток зависает

01.02.2015, 12:49. Просмотров 1459. Ответов 1
Метки нет (Все метки)

Доброго времени суток!

Помогите найти ошибку. После старта потока файл начинает загружатся а после чего поток зависает

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
....
 
var
  Form1: TForm1;
  WorkMax, TickCount, BytesCount: Int64;
  link: string;
 
implementation
 
{$R *.dfm}
 
function ExtractUrlFileName(const FileName: string): string;
var
  I: Integer;
begin
  I := FileName.LastDelimiter('/');
  Result := FileName.SubString(I + 1);
end;
 
function SizeOfFile(Size: Double): String;
begin
  if Size < 1024 then
    Result := Format('%.2f', [Size]) + ' Б';
  if Size > 1024 then
    Result := Format('%.2f', [Size / 1024]) + ' Кб';
  if Size > 1048576 then
    Result := Format('%.2f', [Size / 1048576]) + ' Мб';
  if Size > 1073741824 then
    Result := Format('%.2f', [Size / 1073741824]) + ' Гб';
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  adir, afile: string;
begin
  if SelectDirectory('Выберите каталог', '', adir) then
  begin
    if adir[Length(adir)] <> '\' then
      adir := adir + '\';
    afile := ExtractUrlFileName(link);
    Edit1.Text := adir + afile;
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  IdThreadComponent1.Start;
end;
 
procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
var
  I: Int64;
begin
  if (ASender as TIdHttp).Response.ResponseCode <> 200 then
    Exit;
  ProgressBar1.Position := AWorkCount;
  ProgressBar2.Position := WorkMax - AWorkCount;
  CaptionDownload.Caption := SizeOfFile(AWorkCount);
  CaptionLeft.Caption := SizeOfFile(WorkMax - AWorkCount);
  I := GetTickCount;
  if I > TickCount then
    CaptionSpeed.Caption := SizeOfFile((AWorkCount - BytesCount) *
      (1000 / (I - TickCount))) + '/c';
  BytesCount := AWorkCount;
  TickCount := I;
end;
 
procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
  if (ASender as TIdHttp).Response.ResponseCode <> 200 then
    Exit;
  TickCount := GetTickCount;
  BytesCount := 0;
  WorkMax := AWorkCountMax;
  CaptionSizeFile.Caption := SizeOfFile(WorkMax);
  ProgressBar1.Max := WorkMax;
  ProgressBar1.Position := 0;
  ProgressBar2.Max := WorkMax;
  ProgressBar2.Position := WorkMax;
end;
 
procedure TForm1.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  if (ASender as TIdHttp).Response.ResponseCode <> 200 then
    Exit;
  Timer1.Enabled := false;
  IdThreadComponent2.Start;
end;
 
procedure TForm1.IdThreadComponent1Run(Sender: TIdThreadComponent);
var
  Stream: TFileStream;
  Http1: TIdHttp;
begin
  CaptionTime.Caption := '00:00:00';
  Timer1.Tag := 0;
  Timer1.Enabled := true;
  Stream := TFileStream.Create(Edit1.Text, fmCreate);
  Http1 := TIdHttp.Create(nil);
  Http1.HandleRedirects := true;
  Http1.OnWorkBegin := IdHTTP1WorkBegin;
  Http1.OnWork := IdHTTP1Work;
  Http1.OnWorkEnd := IdHTTP1WorkEnd;
  try
    Http1.get(link, Stream);
  except
    if IdThreadComponent1.Terminated then
      Exit;
    Sender.Synchronize(messageerror);
    Stream.Free;
    Http1.Free;
    Timer1.Enabled := false;
    IdThreadComponent1.Stop;
    Exit;
  end;
  Stream.Free;
  Http1.Free;
  IdThreadComponent1.Stop;
end;
 
procedure TForm1.IdThreadComponent2Run(Sender: TIdThreadComponent);
begin
  Sender.Synchronize(messageok);
  IdThreadComponent2.Stop;
end;
 
procedure TForm1.messageerror;
begin
  ShowMessage('Ошибка');
end;
 
procedure TForm1.messageok;
begin
  ShowMessage('Файл загружен');
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
  ss, mm, hh: string;
begin
  Timer1.Tag := Timer1.Tag + 1;
  ss := Format('%.2u', [Timer1.Tag mod 60]);
  mm := Format('%.2u', [(Timer1.Tag div 60) mod 60]);
  hh := Format('%.2u', [(Timer1.Tag div 3600) mod 24]);
  CaptionTime.Caption := hh + ':' + mm + ':' + ss;
end;
 
end.
как я понял ошибка где-то тут:

Delphi
1
2
3
4
ProgressBar1.Position := AWorkCount;
ProgressBar2.Position := WorkMax - AWorkCount;
CaptionDownload.Caption:=SizeOfFile(AWorkCount);
CaptionLeft.Caption:=SizeOfFile(WorkMax - AWorkCount);
потому что если закоментировать файл загружается нормально, но как исправить эту ошибку?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2015, 12:49
Ответы с готовыми решениями:

После 15 секунд нормальной работы система зависает, после нескольких перезагрузок вообще перестал загружаться
Доброго вечера! Сегодня утром столкнулся с такой проблемой. Включил компьютер, все нормально...

После включения, компьютер стал работать 5-10 минут, после чего зависает
Проблема такая. После включения, компьютер стал работать 5-10 минут, после чего зависает: мышь и...

Не могу запустить Windows после того как выключили свет, только начинает загружаться и делает перезагрузку
ребята не могу запустить Windows по сле того как выключили свет.Только начинает Загружаться и...

Винда показала синий экран, после чего наотрез отказалась загружаться.
Доброго времени суток Винда показала синий экран, после чего наотрез отказалась загружаться....

1
2645 / 2268 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
01.02.2015, 18:57 2
// В дополнительном потоке это делать можно с большой осторожностью
ProgressBar1.Position := AWorkCount;
ProgressBar2.Position := WorkMax - AWorkCount;
// А этого делать вообще нельзя
CaptionDownload.Caption:=SizeOfFile(AWorkCount);
CaptionLeft.Caption:=SizeOfFile(WorkMax - AWorkCount);
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2015, 18:57

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

Передача метода в поток после инициализации потока
Разработать класс ThreadPool. Объект этого класса содержит несколько потоков, находящихся в...

ЖД во время работы начинает издавать звуки раскрутки и трещания после чего вовсе перестает работать
Вообщем купил жесткий года 2 назад, месяца через 2 стал некорректно работать: во время работы...

Отправить файл загружаться сразу после его выбора
&lt;form action=&quot;&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt; &lt;input type=&quot;file&quot;...

Была закуплена и установлена видеокарта Inno GeForce 210 5120Mb после чего BIOS матери начал загружаться больше десяти минут
Господа техножрецы помогайте: Мать:Foxconn P4M 890-8237 Проц:Intel Celeron D 331 Prescott ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.