|
Вопрос # 4 105/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Пытаюсь создать 36 потоков для генерации всех возможных вариантов последовательности символов, записанных в Edit1. По 6 символов в каждой строке.
Почему-то параллельной генерации не получается, код работает как одним потоком. Помогите разобраться, я ламер!
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls,syncobjs;
-
- type
- TYourThread = class(TTHread)
-
- private
- a1:word;
- protected
- procedure Doit;
- procedure Execute; override;
- public
- constructor Create(CreateSuspennded: Boolean; aa1:word);
- end;
-
-
- TForm1 = class(TForm)
- Button1: TButton;
- txt: TMemo;
- Edit1: TEdit;
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
- tt:array[1..36] of TYourThread;
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.Button1Click(Sender: TObject);
- var
- a1:byte;
- begin
- for a1:=1 to 36 do begin
- tt[a1] := TYourThread.Create(True, a1);
- tt[a1].Resume;
-
- end;
- end;
-
- { TYourThread }
-
- constructor TYourThread.Create(CreateSuspennded: Boolean;
- aa1:word);
- begin
- inherited Create(CreateSuspennded);
- a1:=aa1;
-
- end;
-
- procedure TYourThread.Doit;
- var
- a2,a3,a4,a5,a6:byte;
- begin
- for a2:=1 to Length(Form1.edit1.Text)-1 do
- for a3:=1 to Length(Form1.edit1.Text)-1 do
- for a4:=1 to Length(Form1.edit1.Text)-1 do
- for a5:=1 to Length(Form1.edit1.Text)-1 do
- for a6:=1 to Length(Form1.edit1.Text)-1 do
- Form1.txt.Lines.Add(Form1.edit1.Text[self.a1]+Form1.edit1.Text[a2]+
- Form1.edit1.Text[a3]+Form1.edit1.Text[a4]+
- Form1.edit1.Text[a5]+Form1.edit1.Text[a6]+
- Form1.edit1.Text[a7]+Form1.edit1.Text[a8]) ;
-
- end;
-
- procedure TYourThread.Execute;
- begin
- Synchronize(doit);
- end;
-
- end.
 |
Вопрос задал: webkent (статус: 2-ой класс)
Вопрос отправлен: 30 апреля 2010, 00:37
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 29; последнее сообщение — 30 апреля 2010, 19:20; участников в обсуждении: 3.
Страницы: [1] [2] [Следующая »]
|
min@y™ (статус: Доктор наук), 30 апреля 2010, 08:21 [#1]:
Ну ясен пень. Метод Doit() выполняется-то в главном потоке!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
webkent (статус: 2-ой класс), 30 апреля 2010, 08:24 [#2]:
Подскажите плиз как сделать, у меня опыта в работе с потоками еще нет.
|
|
min@y™ (статус: Доктор наук), 30 апреля 2010, 08:28 [#3]:
Цитата (webkent):
Подскажите плиз как сделать, у меня опыта в работе с потоками еще нет.
Сначала мне надо узнать, что же ты такого хочешь сделать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 30 апреля 2010, 10:43 [#4]:
Сколько рассказывать - метод Synchronize - это плохой костыль. Если кто то бы разобрался как он внутри работает - сразу бы перестал работать с ним. В целом - всё, что вызывается через эту фунцию - выполняется в главном потоке и два потока одновременно не могут находиться внутри блока Synchronize.
В целом, в данном коде тормозит не цикл, а само добавление в мемо. При кол-ве строк больше 1000, каждая строка будет добавляться заметно дольше.
И последнее - в потоке обращаться напрямую к элементам формы - первый признак очень ужасного кода.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
webkent (статус: 2-ой класс), 30 апреля 2010, 10:56 [#5]:
Спасибо, уже знаю, что не правильно, подскажите как надо, пожалуйста! Можно вместо МЕМО использовать TStringList или TStrings?
Min@y всё же написано в вопросе - что мненужно сделать, что уточнить?
|
|
Вадим К (статус: Академик), 30 апреля 2010, 11:09 [#6]:
TStringList можно использовать. TStrings - не совсем - это абстрактный класс.
По поводу "что же сделать". Все параметры для генерации пароля передавать в тред (он же поток) в виде некой структуры/класса/набора переменных. Оттудова возвращаться в таком же виде. TStringList можно использовать, если предварительно выделить в нем достаточно памяти - тогда будет быстрее добавляться. Выделение памяти - свойство Capacity.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
webkent (статус: 2-ой класс), 30 апреля 2010, 11:26 [#7]:
Вадим К, спасибо, как только с работы приду буду пробовать!
|
|
min@y™ (статус: Доктор наук), 30 апреля 2010, 11:27 [#8]:
Цитата (webkent):
всё же написано в вопросе - что мненужно сделать, что уточнить?
Всё, что написано в вопросе - это попытка решить какую-то задачу. Мне хотелось бы знать, что это за задача (найти все сочетания символов строки, да?) и зачем для её решения нужно использовать многопоточность, а также, зачем именно 36 потоков?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 30 апреля 2010, 11:50 [#9]:
36 это 26+10, что тут не понятно ?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 30 апреля 2010, 11:55 [#10]:
Цитата (Вадим К):
36 это 26+10, что тут не понятно  ?
А разве это не 9·4?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 30 апреля 2010, 12:04 [#11]:
это может быть и 9*4, но в случае 26+10 применимо к данной задаче эти числа имеют смысл. а 9 и 4 - нет.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
webkent (статус: 2-ой класс), 30 апреля 2010, 15:25 [#12]:
Вадим К прав, 10 это количество цифр (0..9), 26 - это количество латинских букв. Задача... Поправьте, если я не прав, но разве не быстрее будет идти генерация чисел по 36-ти потокам, нежели по одному?
|
|
webkent (статус: 2-ой класс), 30 апреля 2010, 15:29 [#13]:
и да, там при выводе в мемо стоит добавка a7 и a8 иху же нет, забыл убрать из того места. А так всё остальное актуально.
|
|
Вадим К (статус: Академик), 30 апреля 2010, 15:32 [#14]:
скажем так, для данного алгоритма не получиться получить дополнительного ускорения, если кол-во рабочих потоков (кроме основного) больше кол-ва ядер. для старых машин - одно ядро - один поток. Для Core Duo и подобных - 2.
Но это в идеальном случае. Если код активно работает с памятью (в Вашем случае добавляются новые комбинации), то производительность может заметно упасть.
С гипертрейдингом шутки плохи. Хотя видно два ядра, реально там один. То есть, при маленькой нагрузке он хорошо эмулирует двухядерность, на полной загрузке - не очень.
Если же потоков будет 36, то процессор будет в основном заниматься тем, что будет переключать процессы.
Итого, для данной задачи, более чем достаточно - один дополнительный поток. Что бы не тормозил интерфейс. Все.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 30 апреля 2010, 16:22 [#15]:
Цитата (webkent):
10 это количество цифр (0..9), 26 - это количество латинских букв.
А что, юзер не может вводить ничего, кроме этого? Ткните меня носом в то место вопроса, где это указано!
Цитата (Вадим К):
Итого, для данной задачи, более чем достаточно - один дополнительный поток. Что бы не тормозил интерфейс. Все.
Достаточно главного потока. Чтобы не тормозил инферфейс, достаточно Application.ProcessMessages() в пропорции 1:1000 и какой-нить ProgressBar.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 30 апреля 2010, 16:37 [#16]:
мне кажется, что min@y™'я сегодня подменили. удивляется явным вещам... хотя может это просто пятница.
Application.ProcessMessages() - это очень плохо. Говорю "очень плохо и ужасно". Если просто на коленке делается одноразовая программа, что бы проверить какую то свою идею, это одно дело. А вот когда хоть чуточку многоразовая, то лучше не использовать.
Цитата (min@y™):
А что, пользователь не может вводить ничего, кроме этого? Ткните меня носом в то место вопроса, где это указано!
почему 36, почему только латинские буквы и цифры? ну решил вопрошающий так. И все. и вводить будет он. Это его программа.
просто мы не видим форму, там наверно все 36 символов в edit1.Text.
Конечно, потом, когда будет один символ удален с edit1, будет маленький "упс", но это будет.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 30 апреля 2010, 16:54 [#17]:
Цитата (Вадим К):
мне кажеться, что min@y™'я сегодня подменили. удивляется явным вещам... хотя может это просто пятница.
Я таки вижу, шо ви там на Дерибасовской тоже пятницу празднуете да и конец квітня. Я тоже тебя не узнаю: пишешь с ошибками.
Цитата (Вадим К):
ну решил вопрошающий так
Ну конечно! А мне опять надо телепатор включать?
Сформулировал бы задачу по-человечески, не было бы этого флейма в форуме.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 30 апреля 2010, 17:03 [#18]:
один мягкий знак упустил (уже нет его там ) - учитывая, что русский для меня далеко не родной и я учил его (ДА ДА ДА, в Одессе есть люди, которые от рождения говорят на украинском, что бы там не говорили).
Хотя то, что в данном случае у вопрошающего 36 тредов не играет роли никакой. Хоть триста. (другое дело, что этот код на 300 потоков не заработает...). Так что кто ещё развел флейм
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 30 апреля 2010, 17:13 [#19]:
Цитата (Вадим К):
кажется
Молодец, почти всё исправил.
А вот Application.ProcessMessages() - это не есть плохо. Я использую потоки только там, где это необходимо. Пусть я немного проиграю в скорости, зато так проще в отладке, стабильнее. Этот метод у меня вызывается строго 100 раз (при каждом инкременте индикатора прогресса), если цикл обработки длится относительно недолго. Иначе (что бывает очень редко) я его вызываю в эмпирически выявленной пропорции или по отмеренному времени.
Естественно, когда относительную скорость предугадать невозможно, я делаю дополнительную нить. Например, при запросе к веб-серверу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 30 апреля 2010, 17:22 [#20]:
Цитата (Вадим К):
Так что кто ещё развел флейм
Да как ты не поймёшь!.. Этим флеймом я хочу научить автора правильно формулировать задачу, а то и так каждый второй вопрос здесь генерирует "Сагу про X-Y-Z". Меня реально напрягает с помощью терморектального криптоанализа выпытывать из вопрощающих интересующие меня исходные данные.
Так что реальный провокатор флейма - направильно и/или туманно поставленный вопрос, часто не позволяющий понять, зачем это вообще нужно, и вызывающий подозрения, что всё можно сделать проще, лучше и быстрее.
Про 26+10 я, конечно, понял. 9·4 - это ирония.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|