Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 105

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Пытаюсь создать 36 потоков для генерации всех возможных вариантов последовательности символов, записанных в Edit1. По 6 символов в каждой строке.

Почему-то параллельной генерации не получается, код работает как одним потоком. Помогите разобраться, я ламер!

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls,syncobjs;
  8.  
  9. type
  10. TYourThread = class(TTHread)
  11.  
  12. private
  13. a1:word;
  14. protected
  15. procedure Doit;
  16. procedure Execute; override;
  17. public
  18. constructor Create(CreateSuspennded: Boolean; aa1:word);
  19. end;
  20.  
  21.  
  22. TForm1 = class(TForm)
  23. Button1: TButton;
  24. txt: TMemo;
  25. Edit1: TEdit;
  26. procedure Button1Click(Sender: TObject);
  27. private
  28. { Private declarations }
  29. public
  30. { Public declarations }
  31. end;
  32.  
  33. var
  34. Form1: TForm1;
  35. tt:array[1..36] of TYourThread;
  36. implementation
  37.  
  38. {$R *.dfm}
  39.  
  40. procedure TForm1.Button1Click(Sender: TObject);
  41. var
  42. a1:byte;
  43. begin
  44. for a1:=1 to 36 do begin
  45. tt[a1] := TYourThread.Create(True, a1);
  46. tt[a1].Resume;
  47.  
  48. end;
  49. end;
  50.  
  51. { TYourThread }
  52.  
  53. constructor TYourThread.Create(CreateSuspennded: Boolean;
  54. aa1:word);
  55. begin
  56. inherited Create(CreateSuspennded);
  57. a1:=aa1;
  58.  
  59. end;
  60.  
  61. procedure TYourThread.Doit;
  62. var
  63. a2,a3,a4,a5,a6:byte;
  64. begin
  65. for a2:=1 to Length(Form1.edit1.Text)-1 do
  66. for a3:=1 to Length(Form1.edit1.Text)-1 do
  67. for a4:=1 to Length(Form1.edit1.Text)-1 do
  68. for a5:=1 to Length(Form1.edit1.Text)-1 do
  69. for a6:=1 to Length(Form1.edit1.Text)-1 do
  70. Form1.txt.Lines.Add(Form1.edit1.Text[self.a1]+Form1.edit1.Text[a2]+
  71. Form1.edit1.Text[a3]+Form1.edit1.Text[a4]+
  72. Form1.edit1.Text[a5]+Form1.edit1.Text[a6]+
  73. Form1.edit1.Text[a7]+Form1.edit1.Text[a8]) ;
  74.  
  75. end;
  76.  
  77. procedure TYourThread.Execute;
  78. begin
  79. Synchronize(doit);
  80. end;
  81.  
  82. end.


webkent Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: webkent (статус: 2-ой класс)
Вопрос отправлен: 30 апреля 2010, 00:37
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 29; последнее сообщение — 30 апреля 2010, 19:20; участников в обсуждении: 3.

Страницы: [1] [2] [Следующая »]

min@y™

min@y™ (статус: Доктор наук), 30 апреля 2010, 08:21 [#1]:

Ну ясен пень. Метод Doit() выполняется-то в главном потоке!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
webkent

webkent (статус: 2-ой класс), 30 апреля 2010, 08:24 [#2]:

Подскажите плиз как сделать, у меня опыта в работе с потоками еще нет.
min@y™

min@y™ (статус: Доктор наук), 30 апреля 2010, 08:28 [#3]:

Цитата (webkent):

Подскажите плиз как сделать, у меня опыта в работе с потоками еще нет.

Сначала мне надо узнать, что же ты такого хочешь сделать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 30 апреля 2010, 10:43 [#4]:

Сколько рассказывать - метод Synchronize - это плохой костыль. Если кто то бы разобрался как он внутри работает - сразу бы перестал работать с ним. В целом - всё, что вызывается через эту фунцию - выполняется в главном потоке и два потока одновременно не могут находиться внутри блока Synchronize.
В целом, в данном коде тормозит не цикл, а само добавление в мемо. При кол-ве строк больше 1000, каждая строка будет добавляться заметно дольше.

И последнее - в потоке обращаться напрямую к элементам формы - первый признак очень ужасного кода.
Галочка "подтверждения прочтения" - вселенское зло.
webkent

webkent (статус: 2-ой класс), 30 апреля 2010, 10:56 [#5]:

Спасибо, уже знаю, что не правильно, подскажите как надо, пожалуйста! Можно вместо МЕМО использовать TStringList или TStrings?

Min@y всё же написано в вопросе - что мненужно сделать, что уточнить?
Вадим К

Вадим К (статус: Академик), 30 апреля 2010, 11:09 [#6]:

TStringList можно использовать. TStrings - не совсем - это абстрактный класс.
По поводу "что же сделать". Все параметры для генерации пароля передавать в тред (он же поток) в виде некой структуры/класса/набора переменных. Оттудова возвращаться в таком же виде. TStringList можно использовать, если предварительно выделить в нем достаточно памяти - тогда будет быстрее добавляться. Выделение памяти - свойство Capacity.
Галочка "подтверждения прочтения" - вселенское зло.
webkent

webkent (статус: 2-ой класс), 30 апреля 2010, 11:26 [#7]:

Вадим К, спасибо, как только с работы приду буду пробовать!
min@y™

min@y™ (статус: Доктор наук), 30 апреля 2010, 11:27 [#8]:

Цитата (webkent):

всё же написано в вопросе - что мненужно сделать, что уточнить?

Всё, что написано в вопросе - это попытка решить какую-то задачу. Мне хотелось бы знать, что это за задача (найти все сочетания символов строки, да?) и зачем для её решения нужно использовать многопоточность, а также, зачем именно 36 потоков?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 30 апреля 2010, 11:50 [#9]:

36 это 26+10, что тут не понятно:)?
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

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

webkent (статус: 2-ой класс), 30 апреля 2010, 15:25 [#12]:

Вадим К прав, 10 это количество цифр (0..9), 26 - это количество латинских букв. Задача... Поправьте, если я не прав, но разве не быстрее будет идти генерация чисел по 36-ти потокам, нежели по одному?
webkent

webkent (статус: 2-ой класс), 30 апреля 2010, 15:29 [#13]:

и да, там при выводе в мемо стоит добавка a7 и a8 иху же нет, забыл убрать из того места. А так всё остальное актуально.
Вадим К

Вадим К (статус: Академик), 30 апреля 2010, 15:32 [#14]:

скажем так, для данного алгоритма не получиться получить дополнительного ускорения, если кол-во рабочих потоков (кроме основного) больше кол-ва ядер. для старых машин - одно ядро - один поток. Для Core Duo и подобных - 2.
Но это в идеальном случае. Если код активно работает с памятью (в Вашем случае добавляются новые комбинации), то производительность может заметно упасть.
С гипертрейдингом шутки плохи. Хотя видно два ядра, реально там один. То есть, при маленькой нагрузке он хорошо эмулирует двухядерность, на полной загрузке - не очень.

Если же потоков будет 36, то процессор будет в основном заниматься тем, что будет переключать процессы.


Итого, для данной задачи, более чем достаточно - один дополнительный поток. Что бы не тормозил интерфейс. Все.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

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™

min@y™ (статус: Доктор наук), 30 апреля 2010, 16:54 [#17]:

Цитата (Вадим К):

мне кажеться, что min@y™'я сегодня подменили. удивляется явным вещам... хотя может это просто пятница.

Я таки вижу, шо ви там на Дерибасовской тоже пятницу празднуете да и конец квітня. Я тоже тебя не узнаю: пишешь с ошибками.

Цитата (Вадим К):

ну решил вопрошающий так

Ну конечно! А мне опять надо телепатор включать?
Сформулировал бы задачу по-человечески, не было бы этого флейма в форуме.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 30 апреля 2010, 17:03 [#18]:

один мягкий знак упустил (уже нет его там:) ) - учитывая, что русский для меня далеко не родной и я учил его (ДА ДА ДА, в Одессе есть люди, которые от рождения говорят на украинском, что бы там не говорили).

Хотя то, что в данном случае у вопрошающего 36 тредов не играет роли никакой. Хоть триста. (другое дело, что этот код на 300 потоков не заработает...). Так что кто ещё развел флейм:)
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 30 апреля 2010, 17:13 [#19]:

Цитата (Вадим К):

кажется

Молодец, почти всё исправил.
А вот Application.ProcessMessages() - это не есть плохо. Я использую потоки только там, где это необходимо. Пусть я немного проиграю в скорости, зато так проще в отладке, стабильнее. Этот метод у меня вызывается строго 100 раз (при каждом инкременте индикатора прогресса), если цикл обработки длится относительно недолго. Иначе (что бывает очень редко) я его вызываю в эмпирически выявленной пропорции или по отмеренному времени.
Естественно, когда относительную скорость предугадать невозможно, я делаю дополнительную нить. Например, при запросе к веб-серверу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 30 апреля 2010, 17:22 [#20]:

Цитата (Вадим К):

Так что кто ещё развел флейм

Да как ты не поймёшь!.. Этим флеймом я хочу научить автора правильно формулировать задачу, а то и так каждый второй вопрос здесь генерирует "Сагу про X-Y-Z". Меня реально напрягает с помощью терморектального криптоанализа выпытывать из вопрощающих интересующие меня исходные данные.
Так что реальный провокатор флейма - направильно и/или туманно поставленный вопрос, часто не позволяющий понять, зачем это вообще нужно, и вызывающий подозрения, что всё можно сделать проще, лучше и быстрее.
Про 26+10 я, конечно, понял. 9·4 - это ирония.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 23 марта 2023, 00:27
Выполнено за 0.02 сек.
Рейтинг@Mail.ru