Экспертная система 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]

Вадим К

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

Я тоже не люблю сагу X-Y-Z. Но в данном случае задача была явна.
Галочка "подтверждения прочтения" - вселенское зло.
webkent

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

у меня проц 4ядерный каждый по 2 потока, значит 8 можно?
min@y™

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

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

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

Результат нужен, но что бы быстрее его формировать, т.к. потом буду и для 7-и 8-ми-9-ти 10-ти символов генерировать и нужен самый быстрый способ.
Вадим К

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

процессор 4 ядра? значит 4 дополнительных потока. Я не писал, что можно по два на ядро.

Но тут проблема в другом месте сидит, и это место - memo. (или TStringList - не важно).
зайдем с другой стороны. пусть пароль 8 символов. 36 вариантов на каждое знакоместо. итого имеем
368 * (8+1) = 2.53899891671e+13 байт = 23Терабайта!
(умножаем на 8+1 -- 8 это кол-во символов в добавляемой строке, 1 - это на перевод строки, хотя может быть и 2.)
Это не вместиться в мемо на 32битной машине (там максимум 2 Гагабайта, если знать, как все затюнинговать, но на самом деле этого никто никогда не достигал, думаю максимум где то пол гига получиться).

О том, сколько будет генерироваться такой пароль, я предоставляю Вам:)
Галочка "подтверждения прочтения" - вселенское зло.
webkent

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

Блин, жаль =) А последняя строчка в тему =)
а по 2 потока на ядро я имел в виду у меня core i7 там вроде как по 2 потока на ядро. В taskmgr показано как 8.
min@y™

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

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

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

Цитата (webkent):

там вроде как по 2 потока на ядро

не путайте. Все из за перевода. там потоки исполнения.

В целом, если код например просто выполняет сложения-вычитание в цикле, то можно получить из этого выгоду. Для этой задачи очень маловероятно. 4 треда - наиболее реально. Хотя, советую Вам ручками протестировать на небольших наборах и посмотреть на скорость. Думаю, реально будет прирост при двух потоках. А на 4 у Вас уже будет падение. На 8 будет ещё больше.
Галочка "подтверждения прочтения" - вселенское зло.
webkent

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

Спасибо за советы, так и сделаю!

Страницы: [« Предыдущая] [1] [2]

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 апреля 2026, 01:07
Выполнено за 0.03 сек.