ShakalX Ответов: 2

C# как я могу заставить эту функцию работать параллельно ?


C# как я могу заставить эту функцию работать параллельно, используя больше потоков или процессорных ядер, чтобы быть быстрее?

<pre> public void ReadAOB(string Scancode)
        {
            if ((int)processhandle > 0)
            {
                IntPtr bytesRead = IntPtr.Zero;
                long MaxAddress = 0;
                if(isbit64)
                     MaxAddress = 0x7fffffffffffffff;
                else
                    MaxAddress = 0x7fffffff;
                long address = 0;
                addresses.Clear();
                do
                {
                    MEMORY_BASIC_INFORMATION m;
                    int result = VirtualQueryEx(processhandle, (IntPtr)address, out m, (uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)));

                    if (m.Protect == AllocationProtectEnum.PAGE_READWRITE)
                    {
                        byte[] buffer = new byte[(int)m.RegionSize];
                        // IntPtr buffer = IntPtr.Zero;
                        ReadProcessMemory(processhandle, m.BaseAddress, buffer, (int)m.RegionSize, out bytesRead);
                        BoyerAlgo(m.BaseAddress, buffer, Scancode, ref addresses);
                    }
                    if (address == (long)m.BaseAddress + (long)m.RegionSize)
                        break;
                    address = (long)m.BaseAddress + (long)m.RegionSize;
                } while (address <= MaxAddress);

            }
        }


Что я уже пробовал:

Это работает, но когда он переходит к сканированию памяти, требуется много времени, чтобы закончить.

2 Ответов

Рейтинг:
2

Patrice T

Не тот ответ, который вы ищете, а другая проблема.

unsigned long MaxAddress = 0;
if(isbit64)
     MaxAddress = 0xffffffffffffffff;
else
    MaxAddress = 0xffffffff;

Адреса никогда не бывают отрицательными, они не подписаны, эта ошибка заставляет вас пропустить половину диапазона.
Нет необходимости инициализировать до нуля, потому что вы сохраняете реальное значение сразу после этого.


ShakalX

О, спасибо =) так что вы можете начать с того, сколько?

Рейтинг:
1

Uroš Šmon

Вы можете попробовать решить эту проблему в несколько шагов
1. Положите вашу завершения цикла do в новый метод с параметрами начального и конечного адреса
2. Разделить весь диапазон памяти (в настоящее время от 0 до MaxAddress) на несколько диапазонов
3. Вызов нового метода с задачей.Запуск и параметры начальная и конечная память диапазон от шага 2
4. дождитесь завершения выполнения всех заданий.Ожидать

Для достижения наилучшей производительности вы должны попытаться определить, сколько параллельных задач оптимально на вашем компьютере.


Jon McKee

Используя такой подход, Parallel.For было бы проще и справиться с оптимальным для вас параллелизмом :)

ShakalX

Моя проблема в том, что я не знаю, как это реализовать. Где я могу найти фрилансера, который сделает это за меня?
Я еще ученик.

Uroš Šmon

Это программист, помогающий программисту сайта, а не фрилансер, который находит сайт.
Так что, сори, тебе придется искать в другом месте

ShakalX

все нормально. ^^