Вопрос № 24046: Как можно изиенить скогость привода в Дельфи как например в CD Slow?...Вопрос № 24065: Здравствуйте!
Подскажите как правильно организовать поток.
Модуль формы
unit Unit1; // Расчет
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Unit2;<...Вопрос № 24067: Здраствуйте уважаемые эксперты, с помощю какова компонента можно написать IRC клиента, дайте ссылку плиз.
Заранее спасибо....
Вопрос № 24.046
Как можно изиенить скогость привода в Дельфи как например в CD Slow?
Отправлен: 26.07.2005, 11:05
Вопрос задал: Малярчук Андрей (статус: Посетитель)
Всего ответов отправлено: 1
Отвечает: Ddeedd
Здравствуйте, Малярчук Андрей!
Скорость привода изменяется с помощью выдачи устройству соответствующих SCSI/ATAPI команд.
Чтобы сделать это надо знать эти команды - в обычных доках по ATAPI столь экзотичесие не описаны обычно. Затем эти команды можно выдать либо через интерфейс ASPI (Win9x), либо для WinNT - через DeviceIoControl. Поищите в инете список ATAPI команд, скачайте NTDDK (Device Driver Development Kit). Можно проще поступить - хакните ваш CD Slow - и все дела.
Ответ отправил: Ddeedd (статус: 3-ий класс)
Отправлен: 26.07.2005, 14:50 Оценка за ответ: 4
Вопрос № 24.065
Здравствуйте!
Подскажите как правильно организовать поток.
Модуль формы
unit Unit1; // Расчет
// Запуск цикла из потока
procedure TForm1.Button1Click(Sender: TObject);
begin
co:= hest.Create(true);
co.Resume;// запустили
co.Priority:= tpNormal; // Нормальный поток
end;
// Стоп
procedure TForm1.Button2Click(Sender: TObject);
begin
co.Terminate;// Стоп
end;
// Пауза
procedure TForm1.Button3Click(Sender: TObject);
begin
co.Suspend;// Приостановили
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9': ; // цифра
',','.' : // точка или запятая
begin
if Key = '.' then Key := ','; // подменим точку запятой
// проверим, есть ли в поле Edit1 запятая
if Pos(',',Edit1.Text) <> 0 // запятая уже есть
then Key:=Char(0); // вторую запятую не отображать
end;
#8 : ; // <Backspace>
#13 : Edit2.SetFocus; // <Enter>
// остальные символы - запрещены
else Key :=Chr(0); // символ не отображать
end;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9': ; // цифра
',','.' : // точка или запятая
begin
if Key = '.' then Key := ','; // подменим точку запятой
// проверим, есть ли в поле Edit2 запятая
if Pos(',',Edit2.Text) <> 0 // запятая уже есть
then Key:=Char(0); // вторую запятую не отображать
end;
#8 : ; // <Backspace>
#13 : Edit3.SetFocus; // <Enter>
#32 : Edit1.SetFocus; // <Space Bar>
// остальные символы - запрещены
else Key :=Chr(0); // символ не отображать
end;
end;
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9': ; // цифра
',','.' : // точка или запятая
begin
if Key = '.' then Key := ','; // подменим точку запятой
// проверим, есть ли в поле Edit3 запятая
if Pos(',',Edit3.Text) <> 0 // запятая уже есть
then Key:=Char(0); // вторую запятую не отображать
end;
#8 : ; // <Backspace>
#32 : Edit2.SetFocus; // <Space Bar>
// остальные символы - запрещены
else Key :=Chr(0); // символ не отображать
end;
end;
end.
Приложение:
Отправлен: 26.07.2005, 18:14
Вопрос задал: Serhik_z (статус: Посетитель)
Всего ответов отправлено: 4
Отвечает: X
Здравствуйте, Serhik_z!
Ну вобще-то в Unit2 в коментариях, вставленных Delphi, написано как надо делать:
Все действия с визуальными компонентами должны происходить в процедуре, которая должна вызываться с помощью Synchronize()
Приложение:
Ответ отправил: X (статус: 7-ой класс)
Отправлен: 26.07.2005, 19:54
Отвечает: Ddeedd
Здравствуйте, Serhik_z!
Могу дать некоторые рекомендации:
В потоке лучше не делать ввода - т.е. спрашивать что-то у юзера - а если все-таки надо - то заключите код запроса у пользователя в процедуру без параметров ("procedure AskUser;") и добавте в свой класс TThread - а из Execute вызывайте ее через Synchronize ("Synchronize(AskUser);")
Также через Synchronize надо вызывать тот код, который общается с VCL классами, используемыми в других потоках, такими как Form1, Form2, Screen и проч. - конечно можно на это забить, но чем чаще в других потоках используется объект - тем выше будет возможность неправильного совместного доступа и глюка соответственно.
Приложение:
Ответ отправил: Ddeedd (статус: 3-ий класс)
Отправлен: 26.07.2005, 19:57
Отвечает: sir henry
Здравствуйте, Serhik_z!
А в чем конкретно сложность?
Ввод, формирование и проверку на корректность данных делайте отдельной процедурой (это в главной форме), а расчет результата - отдельной (назовем ее для примера hest.raschet), занесите ее в hest.execute:
procedure hest.Execute;
begin
{Пока процесс не прервали, выполняем Raschet}
while not Terminated do
Synchronize(Raschet);
end;
Synchronize нужен нам для того, чтобы избежать взаимного мордобоя между потоком главной программы и потоком hest.
Вывод результатов, естественно, тоже должен быть работой главной программы (формы), а не отдельного потока.
А вообще, отдельный поток тут нужен или так, для прикола? :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 26.07.2005, 20:10
Отвечает: Werewolf
Здравствуйте, Serhik_z!
Все немного можно усложнить/упростить чтобы получить максимальную производительность
unit Unit2; // Поток для расчета 'hest'
procedure hest.clearmemo;
begin
form1.Memo1.Clear;
end;
procedure hest.SetFocus;
begin
case edit of
1:Form1.Edit1.SetFocus;
2:Form1.Edit2.SetFocus;
3:Form1.Edit3.SetFocus;
end;
end;
procedure hest.AddToMemo;
begin
Form1.Memo1.Lines.Add(Msg);
end;
procedure hest.Execute;
var
m: real; // Модуль, как дробное число
k: real; // Градусы Угол шестерни
i: real; // Минуты
c: integer; // челое число
d: integer; // дробное число
v: real; // вычисления
aa,bb,cc,dd: integer;
lasttime:cardinal;
begin
try
m:= StrToFloat(trim(Form1.Edit1.Text));
except
on e:EConvertError do begin
Synchronize(ClearMemo);
Msg:='Уважаемый!'#13#10'Введите Модуль';
Synchronize(AddToMemo);
Edit:=1;
Synchronize(SetFocus); // курсор в поле ввода
Exit;// завершить обработку события
end;
end;
try
k:= StrToFloat(trim(Form1.Edit2.Text));
except
on e:EConvertError do begin
Synchronize(ClearMemo);
Msg:='Уважаемый!'#13#10'Введите угол шестерни'#13#10'в градусах';
Synchronize(AddToMemo);
Edit:=2;
Synchronize(SetFocus); // курсор в поле ввода
Exit;// завершить обработку события
end;
end;
try
i:= StrToFloat(trim(Form1.Edit3.Text));
except
on e:EConvertError do begin
Synchronize(ClearMemo);
Msg:='Уважаемый!'#13#10'Введите угол шестерни'#13#10'в Минутах'#13#10'от 0 до 60';
Synchronize(AddToMemo);
Edit:=3;
Synchronize(SetFocus); // курсор в поле ввода
Exit;// завершить обработку события
end;
end;
// предварительные преобразования
c:= Trunc(m); // это целая часть числа t
d:= Trunc(m/2) mod 10000; // это дробная часть числа t
// вычисление
v:=sin(((k+i/60)*pi)/180)*5.96831/m;
// вывод результата
Synchronize(ClearMemo);
Msg:=' Станок F-06, J=5,96831';
Synchronize(AddToMemo);
Msg:=(' Модуль: ' + FloatToStr(m))+(' Градусы: ' + FloatToStr(k))+(' Минуты: ' + FloatToStr(i))+ ('');
Synchronize(AddToMemo);
Msg:=' Дифференциал: ' + FloatToStrF(v,ffFixed,6,5) + '';
Synchronize(AddToMemo);
Msg:=' -------------------------------------------------';
Synchronize(AddToMemo);
Msg:=' -------- Выбор шестерен --------';
Synchronize(AddToMemo);
//( 6-вывод 6 ми цифр. 5 после запятой
Screen.Cursor := crHourGlass;
lasttime:=GetTickCount;
for aa:=20 to 100 do
for bb:=aa+1 to 100 do //если не надо зеркально повторяющихся шестернь
for cc:=20 to 100 do // если надо - напиши как было у тебя
for dd:=cc+1 to 100 do
if (aa<>bb) and(cc<>dd)and //сравнение над целыми происходит быстрее сравнения строк
(round(aa*bb/cc/dd*100000) = round(v*100000))
then begin
Msg:=Format(' Гитара шестерен: %d x %d / %d x %d',[aa,bb,cc,dd]);
Synchronize(AddToMemo);
end;
Screen.Cursor := crDefault;
// Стоп
if terminated then exit;
Msg:=' -------------------------------------------------';
Synchronize(AddToMemo);
Msg:='На расчет затрачено '+inttostr(GetTickCount-lasttime)+'мс';
Synchronize(AddToMemo);
Screen.Cursor := crDefault;
end;
end.
Ответ отправил: Werewolf (статус: 4-ый класс)
Отправлен: 27.07.2005, 01:00
Вопрос № 24.067
Здраствуйте уважаемые эксперты, с помощю какова компонента можно написать IRC клиента, дайте ссылку плиз.
Заранее спасибо.
Отправлен: 26.07.2005, 20:47
Вопрос задал: Станислав (статус: 1-ый класс)
Всего ответов отправлено: 2
Отвечает: Werewolf
Здравствуйте, Станислав!
TIDIRCClient входит в состав библиотеки Indy (которая включена в поставку с Delphi)
Ищи на закладке Indy Clients c рисунком похожим на наручники (хотя скорее всего это два Ballontip'a =)
Со свойствами и методами компонента все просто.
Через свойства Users и Channels, например, можно получить список пользователей и каналов соответственно.
Если будут ещё вопросы пиши. Удачи... =)
Ответ отправил: Werewolf (статус: 4-ый класс)
Отправлен: 26.07.2005, 23:29 Оценка за ответ: 5
Отвечает: And1
Здравствуйте, Станислав!
Хороший компонент для IRC лежит на сайте http://www.vr-online.ru/ в разделе комоненты=>delphi=>что-то связанное с интернетом/сетью (точный линк не помню...). Так же можете помотреть на www.torry.net - там ОГРОМНОЕ количество компонентов, в том числе и для IRC - на любой вкус! :)
Удачи!
Ответ отправил: And1 (статус: 3-ий класс)
Отправлен: 28.07.2005, 15:09 Оценка за ответ: 5