Забавно, а без этих модулей возможно как-нибудь реализовать? Без критических секций наверное не обойтись, или есть другие методы синхронизации в консольке?
Можно обойтись вообще без единого модуля, переписав весь код самому, только тут уже встает вопрос целесообразности
Насчет syncobj нашел решение, без всяких затрат CriticalSection: TRTLCriticalSection; Теперь осталось самое главное - убрать Classes (замена TStringList на array of string, как ты сказал), пока не знаю каким образом..
Accounts.LoadFromFile(OpenDialog1.FileName); /// Code: procedure TNewThread.Execute; var CurAcc:integer; data:Tstringlist; HTTP: TIdHTTP; begin while Work do begin CS.Enter; Inc(Acc); if Acc<Accounts.Count then CurAcc:=Acc else Work:=false; CS.Leave; if Work then begin FAcc:= Copy(Accounts[CurAcc],1,Pos(';',Accounts[CurAcc])-1); FPas:= Copy(Accounts[CurAcc],Pos(';',Accounts[CurAcc])+1,Length(Accounts[CurAcc])); data:=Tstringlist.create; data.Add('st.posted=set'); data.Add('st.email='+FAcc); data.Add('st.password='+FPas); data.Add('st.fJS=enabled'); data.Add('st.screenSize=1366 x 768'); data.Add('st.flashVer=10.1.82'); data.Add('button_go=Войти'); HTTP:=TIdHTTP.create; HTTP.HandleRedirects:=false; try HTTP.Post('', data); Rez:=-1; except if Pos('Set-Cookie: JSESSIONID=', HTTP.Response.RawHeaders.Text)<>0 then Rez:=1 else Rez:=0; end; HTTP.Free; data.Free; Synchronize(Sync); end; end; Грубо говоря это.
В твоем случае ни StringList, ни array of string не нужен. PHP: var data:string; ... begin ... data:='st.posted=set'+#13#10+ 'st.email='+FAcc+#13#10+ 'st.password='+FPas+#13#10+ 'st.fJS=enabled+#13#10+ 'st.screenSize=1366x768'+#13#10+ 'st.flashVer=10.1.82'+#13#10+ 'button_go=Войти';
ппц) Accounts.LoadFromFile(OpenDialog1.FileName); - загрузка списка аккаунтов вида acc;pass потом парсинг до разделителя и после передача их в запрос и т.п. как не нужно) И тот код с indy, а я либо через synapse, если с https, либо через сокеты) Code: while Work do begin CS.Enter; Inc(Acc); if Acc<Accounts.Count then CurAcc:=Acc else Work:=false; CS.Leave; if Work then begin FAcc:= Copy(Accounts[CurAcc],1,Pos(';',Accounts[CurAcc])-1); FPas:= Copy(Accounts[CurAcc],Pos(';',Accounts[CurAcc])+1,Length(Accounts[CurAcc]));
Можно заменить на PHP: var f:textfile account:string; begin AssignFile(f,OpenDialog1.Filename); Reset(f); while not EOF(f) do begin Readln(account,f); ... парсинг строки ... end;
Не совсем понял, каким образом следить за номером строки, каким образом многопоточно обращаться к разным строкам и парсить значения? и т.п.( Кстать, это все в консольке делается)
А, ты строки в потоках парсишь и обрабатываешь...тогда PHP: var f:textfile accounts: array of string; i:integer; begin AssignFile(f,OpenDialog1.Filename); Reset(f); while not EOF(f) do begin inc(i); readln(f); end; Reset(f); SetLength(accounts, i); while not EOF(f) do readln(f,accounts[i]); ... парсинг строки ... end;
PHP: var f:textfile accounts: array of string; i:integer; begin AssignFile(f,OpenDialog1.Filename); Reset(f); // открываем файл на чтение while not EOF(f) do begin // пока не достигнем конца файла inc(i); // увеличиваем счетчик строк на 1 readln(f); // читаем открытый файл построчно end; Reset(f); // открываем файл на чтение SetLength(accounts, i); - // эта строка не компилируется, accounts - это же массив строк, кстати, его фиксированным придется задавать? while not EOF(f) do // пока не достигнут конец файла readln(f,accounts[i]); // записываем открытый файл построчно в созданный массив ... парсинг строки ... end; как-то так? А зачем кстати, лишние строки? Разве не так? PHP: AssignFile(f, 'source.txt'); Reset(f); while not EOF(f) do begin inc(num); readln(f,accounts[num]); writeln(accounts[num]); end;
Первый цикл - считаешь количество учеток в файле Второй цикл - задаешь размер динамического массива, исходя из количества учеток. SetLength(accounts, Succ(i)); //Задание размера динамического массива
Лан, сделаю статический массив) Вроде все, теперь весит 41kb без сжатия, спасибо! )) Это на delphi 3 такой размер, а на delphi7 - 48kb Слушай, со статическим массивом, если ужать пакером, при запуске он занимает кучу места в памяти а с полным кодом который ты написал появляется ошибка access violation Написал, заменив SetLength(accounts,num); на SetLength(accounts,succ(num)); теперь вообще стоит наместе, либо выводит только последнюю строку( Отдельно скомпилировал твой код, выдает Range check error PHP: program Project1; {$APPTYPE CONSOLE} uses SysUtils; var f: textfile; accounts: array of string; i: integer; begin AssignFile(f, 'source.txt'); Reset(f); while not EOF(f) do begin inc(i); readln(f); end; Reset(f); SetLength(accounts, succ(i)); while not EOF(f) do readln(f, accounts[i]); Readln; end.
Писал в сонном виде с отключенным мозгом, а ты такую явную ошибку не заметил PHP: program Project1; {$APPTYPE CONSOLE} uses SysUtils; var f: textfile; accounts: array of string; i,k: integer; begin i:=0; AssignFile(f, 'source.txt'); Reset(f); while not EOF(f) do begin inc(i); readln(f); end; Reset(f); SetLength(accounts, succ(i)); for k:=0 to i do readln(f, accounts[k]); Readln; end. По поводу пакера, не тот пакер используешь, раз он крашит и жрет много памяти
Мда, одну прогу переделал, теперь со второй проблемы, которая на Synapse. Там TStringStream; используется(
Зачем делать массив с 10000000 элементов? Я же тебе привел рабочий пример динамического массива. C TStringStream я никогда не работал, поэтому скорее всего подсказать не смогу.
Не, эт я вчера пробовал) сейчас все норм) Спасибо, значит надо что-то думать насчет замены сетевой библы, либо как-то научить сокеты с SSL работать, https)
Всем привет. А возможно убрать полосы прокрутки в консольном приложении? (и запретить изменение размера).
Да, возможно. Вот набросок на С: PHP: HWND hConsoleWindow = GetConsoleWindow(); // 1. отрубаем изменение размера консольного окна LONG wndStyle = GetWindowLong(hConsoleWindow, GWL_STYLE); wndStyle &= ~WS_SIZEBOX; ShowWindow(hConsoleWindow, SW_HIDE); if (!SetWindowLong(hConsoleWindow, GWL_STYLE, wndStyle)) { return 1; } ShowWindow(hConsoleWindow, SW_SHOW); // 2. убираем скроллинг ShowScrollBar(hConsoleWindow, SB_BOTH, false); // 3. помечаем клиенсткую область окна консоли невалидной, чтобы она перерисовалась // если этого не сделать, возможны глитчи :) RECT clientRect; GetClientRect(hConsoleWindow, &clientRect); InvalidateRect(hConsoleWindow, &clientRect, true);