Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateThread, общение с TForm 
:(
    Опции темы
Петрович
Дата 28.7.2005, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Цитата(Romikgy @ 28.7.2005, 15:24)
Дафай поочереди :

Дафай. smile

Цитата(Romikgy @ 28.7.2005, 15:24)
Это не столь важно букву можно и поменять (т.е. переменную)

Конечно не столь важно, если не столь важен результат smile.


Цитата(Romikgy @ 28.7.2005, 15:24)
pc: array [byte] of char;
Buf: byte;

Ну тогда, в ListBox1.Items.Add('Stroka ' + inttostr(j)+' = '+inttostr(dword(buf))); последний inttostr "хапнет" лишних три байта. Хороше если они там будут, а то и AV схлопотать не долго.
А в ListBox1.Items.Add('Stroka ' + inttostr(j)+' = '+inttohex(pbyte(p+8)^,1)+' '+strpas(pc));, как ты думаешь, куда ссылается pbyte(p+8)? Какому процессу принадлежит память на которую ты таким образом получаешь указатель? И что будет когда произойет обращение к pbyte(p+8)^?


Цитата(Romikgy @ 28.7.2005, 15:24)
Мож и смело, но это вышло после дизассемблирования участка кода с обычным обращением к компоненте.

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


Цитата(Romikgy @ 28.7.2005, 15:24)
И в чем разница???

А вот кстати и пример smile.
Какая версия Delphi у тебя?
Могу тебя поздравить smile. Если в итеме твоего списка окажется строка длиннее 4095 символов, то поведение твоей программы, использующей такой TListBoxStrings, может легко оказаться не предсказуемым!
Вот текст TListBoxStrings.Get из Delphi 6:
Код

function TListBoxStrings.Get(Index: Integer): string;
var
  Len: Integer;
begin
  if ListBox.Style in [lbVirtual, lbVirtualOwnerDraw] then
    Result := ListBox.DoGetData(Index)
  else
  begin
    Len := SendMessage(ListBox.Handle, LB_GETTEXTLEN, Index, 0);
    if Len = LB_ERR then Error(SListIndexError, Index);
    SetLength(Result, Len);
    if Len <> 0 then
    begin
      Len := SendMessage(ListBox.Handle, LB_GETTEXT, Index, Longint(PChar(Result)));
      SetLength(Result, Len);  // LB_GETTEXTLEN isn't guaranteed to be accurate
    end; 
  end;
end;

Вот именно так и должно быть, поскольку размер строки, которая будет возвращена SendMessage(..., LB_GETTEXT,...), заранее неизвестен, а соответственно, заранее и неизвестен размер необходимого буфера.
Кстати, а у тебя может сломаться уже на строках длинной более 254 символа (pc: array [byte] of char).


Цитата(Romikgy @ 28.7.2005, 15:24)
То что проверок нет??? ну дык это при написании так сказать релиза учтется

Ну... Трудно предположить что при выпуске релиза программист будет скорпулезно проходиться по всему тексту и расставлять обработку ошибок. По крайней мере я такого не видел. Лично я, сразу-же прописываю обработку ошибок. Особенно, учитывая то, что это часто влияет на построение текста программы.
Да и при отладке, частенько можно получить ошибку там где ее не получаешь в уже отлаженной программе. В этом случае гораздо приятнее узнать о ней сразу, а не выискивать "почему программа ведет себя не правильно?".


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Romikgy
Дата 29.7.2005, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата
Дафай.

Аналогично smile

Цитата
Конечно не столь важно, если не столь важен результат

К словам дафай не будем цеплятся , а !?
Цитата
Ну тогда, в ListBox1.Items.Add('Stroka ' + inttostr(j)+' = '+inttostr(dword(buf))); последний inttostr "хапнет" лишних три байта. Хороше если они там будут, а то и AV схлопотать не долго.

dword(buf) - это не захват 4 байт, это преобразование захваченного байта в переменную типа дворд , так что ничего я хватать лишнего не буду !!!
Цитата
А в ListBox1.Items.Add('Stroka ' + inttostr(j)+' = '+inttohex(pbyte(p+8)^,1)+' '+strpas(pc));, как ты думаешь, куда ссылается pbyte(p+8)? Какому процессу принадлежит память на которую ты таким образом получаешь указатель? И что будет когда произойет обращение к pbyte(p+8)^?

Здеся признаю , лажанулся smile , эта часть кода осталась от экспериментов со своим компонентом, так что сорри!
Цитата
А вот кстати и пример smile.
Какая версия Delphi у тебя?
Могу тебя поздравить smile. Если в итеме твоего списка окажется строка длиннее 4095 символов, то поведение твоей программы, использующей такой TListBoxStrings, может легко оказаться не предсказуемым!
Вот текст TListBoxStrings.Get из Delphi 6:

Да у меня стоит третья дельфя, есть разница сначала берется длинна текста smile
а вот это что:

Цитата
if ListBox.Style in [lbVirtual, lbVirtualOwnerDraw] then
    Result := ListBox.DoGetData(Index)

И последнее
Цитата
Вот именно так и должно быть, поскольку размер строки, которая будет возвращена SendMessage(..., LB_GETTEXT,...), заранее неизвестен, а соответственно, заранее и неизвестен размер необходимого буфера.
Кстати, а у тебя может сломаться уже на строках длинной более 254 символа (pc: array [byte] of char).

Я на 100 процентов уверен , что длинны у меня не будут превышать даже 50 символов, так что все окей smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Петрович
Дата 29.7.2005, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Цитата(Romikgy @ 29.7.2005, 09:22)
Цитата (Петрович @ 28.7.2005, 15:56)
Конечно не столь важно, если не столь важен результат


К словам дафай не будем цеплятся , а !?

Дык не к словам. У тебя так в программе написано.

Цитата(Romikgy @ 29.7.2005, 09:22)
dword(buf) - это не захват 4 байт, это преобразование захваченного байта в переменную типа дворд , так что ничего я хватать лишнего не буду !!!

Согласен. Я что-то стормозил, здесь же не указатель преобразовывается, а непосредственно переменная.


Цитата(Romikgy @ 29.7.2005, 09:22)
а вот это что:

Цитата (Петрович @ 28.7.2005, 15:56)
if ListBox.Style in [lbVirtual, lbVirtualOwnerDraw] then
    Result := ListBox.DoGetData(Index)

Просто существуют ListBox'ы для которых текст вообще не хранится. Он прорисовывается программой по событию.

Цитата(Romikgy @ 29.7.2005, 09:22)
Я на 100 процентов уверен , что длинны у меня не будут превышать даже 50 символов, так что все окей

Хозяин барин. Я лично в своей жизни никогда ни в чем на все 100% не уверен smile.


Ну и в конце концов, так я понял у тебя теперь все нормально работает?



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Romikgy
Дата 29.7.2005, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата
Дык не к словам. У тебя так в программе написано.

Дык это только переменная smile

Цитата
Просто существуют ListBox'ы для которых текст вообще не хранится. Он прорисовывается программой по событию.

Оригинально , не встречал .
Цитата
Хозяин барин. Я лично в своей жизни никогда ни в чем на все 100% не уверен

Угу
Цитата
Ну и в конце концов, так я понял у тебя теперь все нормально работает?

На н-ное кол-во процентов,
с Checklistbox я разобрался,
с TreeView разбираюсь (никак не пойму как программно к детю обратится/выделить , апи или мессагой?)
с DBGrid вооще мрак, здеся подсказали ридонли параметр подравить и можно в принципе , через энтер или двойной щелчек мыши , к данным добратся , но как подправить? еслиб тоже через апи или мессаги, былоб гуд smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Петрович
Дата 29.7.2005, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Цитата(Romikgy @ 29.7.2005, 15:39)
На н-ное кол-во процентов,
с Checklistbox я разобрался,
с TreeView разбираюсь (никак не пойму как программно к детю обратится/выделить , апи или мессагой?)
с DBGrid вооще мрак, здеся подсказали ридонли параметр подравить и можно в принципе , через энтер или двойной щелчек мыши , к данным добратся , но как подправить? еслиб тоже через апи или мессаги, былоб гуд 

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



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Girder
Дата 30.7.2005, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



М
 
Не отвлекаемся :)
PS: Один топик - один вопрос!



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Romikgy
Дата 1.8.2005, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



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

Конкретное приложение мне известно, а вот версия дельфи ... smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
alexkras
Дата 10.11.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 10.11.2009

Репутация: нет
Всего: нет



Обнаружил одну особенность. После вызова CreateThread в теле функции-задачи пытаюсь оператором cin ввести целое число(scanf тоже не помогает), но у меня первая цифра "пропадает", т.е. если я ввожу 430, то в переменную записывается 30, 12 - 2, 1999 - 999 и т.д. С чем это связано? Я решил эту проблему, передавая в качестве четвертого параметра CreateThread это самое число(приведенное к типу LPVOID, естественно), которое ввожу с консоли еще до вызова CreateThread, т.е. в функции main. Но все-таки хочу разобраться с этой особенностью. 

Предлагаю код(тот, что проблемный):
Код

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <math.h>
using namespace std;


DWORD WINAPI MyThread (LPVOID lpParam){
    HANDLE hSem = CreateSemaphore(NULL,10,10,NULL);
    LONG count = 0;
    int n = 0;
    cout << "Input n: ";
    cin >> n;
        cout << "n: " << n << endl;
    double k = 30;
    double* mas;
    mas = new double [n];
    for (int i = 0; i < n; ++i)
        mas[i]=0;
    CRITICAL_SECTION MyCriticalSection;
    InitializeCriticalSection(&MyCriticalSection);
    EnterCriticalSection(&MyCriticalSection);
    WaitForSingleObject(hSem, INFINITE);
    for (double j = 1.0; j < k; ++j)
        mas[0] += 1/(1.0 + log(5*j) + 8.0);
    double sum = mas[0];
    ReleaseSemaphore(hSem, 1, &count);
    LeaveCriticalSection(&MyCriticalSection);
    for ( int i = 1; i < 10; ++i )
        {WaitForSingleObject(hSem, INFINITE);
        for ( double j = 1.0; j < k; ++j )
            {mas[i] += 1/(double((i+1)*(i+1)) + log(5*j) + 8.0);
            }
        sum += mas[i];
        }

    for ( int i = 10; i < n; ++i )
        {ReleaseSemaphore(hSem, 1, &count);
            for ( double j = 1.0; j < k; ++j )
            {mas[i] += 1/(double((i+1)*(i+1)) + log(5*j) + 8.0);
            }
        WaitForSingleObject(hSem, INFINITE);
        sum += mas[i];
        }
    for (int i = 0; i < 10; ++i)
        {ReleaseSemaphore(hSem, 1, &count);
        }
    cout << "Sum: " << sum << endl;
    CloseHandle(hSem);
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{    
    DWORD ThreadId;
    CreateThread(NULL, NULL, MyThread, NULL, NULL, &ThreadId);
    

    cin.get();
    cin.get();
    return 0;
}


Все в обычной консоли Win32. Может, у кого-то по-другому?
PM MAIL   Вверх
Romikgy
Дата 11.11.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



скорее всего стандартным потоком ввода-вывода владеет основной поток, поэтому он первый символ съедает,
имхо не красиво работать с такими потоками из программных потоков, вся работа должна оставаться в основном потоке , а обработка данных , там где хочешь .....
PS сорри за тавтологию


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1069 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.