Каково различное между API-функциями AllocConsole и AttachConsole (-1)?

В основном этот тип медлительности происходит из-за совершения этой ошибки:

for (var i = 0; i<100; i++)
{
   // do a network-roundtrip/remoting/io/etc
}

, и решение состоит в том, чтобы изменить его на:

// do a network-roundtrip/remoting/io/etc
for (var i = 0; i<100; i++)
{
    // do something with the result of the above call
}

Так что, если я правильно вас понял, данные Global.holidayGlobals.Values поступают из другого процесса, например, из кеша памяти. Если это так, вам проще всего изменить код на:


int limit=450;
public bool functionUI()
{
    var holidays = Global.holidayGlobals.Values;
    for(int i=0;i< limit ; i++)
    {
        functionApp(i, holidays);
    }
}


public static bool functionApp(int i, IEnumerable<HolidayEntity> holidays)
{
    foreach(var h in holidays)
    {
        if(h.Value == i)
        {
             return false;
        }
    }
    return true;
}

Мы все еще делаем слишком много работы в циклах (мы можем улучшить алгоритм, создав словарь и просто просмотрев его), но для по вашему номеру (450) это ничтожно мало по сравнению со временем одной поездки туда и обратно в кэш памяти.

ОБНОВЛЕНИЕ

Из комментариев к вопросу видно, что holidays равно Dictionary<int, HolidayEntity>, если так, код может стать намного лучше, как это:

[113 ]
7
задан abatishchev 14 September 2011 в 01:40
поделиться

3 ответа

Ну, принципиальное различие:

  • AllocConsole() создаст новую консоль (и присоединит к нему),
  • AttachConsole( ATTACH_PARENT_PROCESS /* -1 */) не создаст новую консоль, она присоединит к существующей консоли родительского процесса.

В первом случае Вы получаете совершенно новую консоль во втором случае, Вы используете существующую консоль.

Конечно, если Вы уже привязаны к консоли (т.е., Вы - программа консольного режима, запущенная из cmd.exe) нет большого различия - Вы получите ошибку с любым API.

Также обратите внимание, что просто, потому что Вы отсоединяетесь от консоли, не означает, что отдельная консоль будет полезна - например, если Вы будете консольным процессом, запущенным из cmd окна, того окна по существу блоки, пока Ваш процесс не заканчивается.

Некоторый код для проигрывания с:

int main( int argc, char* argv[])
{
    int ch;
    BOOL bResult;

    printf( "default console\n");
    ch = getchar();

    bResult = FreeConsole();
    bResult = AllocConsole();    
    printf( "AllocConsole()\n");
    ch = getchar();

    bResult = FreeConsole();
    bResult = AttachConsole( ATTACH_PARENT_PROCESS);    
    printf( "AttachConsole( ATTACH_PARENT_PROCESS)\n");
    ch = getchar();

    return 0;
}
13
ответ дан 6 December 2019 в 10:54
поделиться

Это было некоторое время, так как я использовал winapi, но я искал документацию MSDN, и я не смог найти API-функцию CreateConsole. Таким образом, мое предположение - то, что CreateConsole является материалом прежней версии и был заменен AttachConsole. Таким образом, нет, вероятно, никакого различия, но CreateConsole был, вероятно, удержан от использования.

0
ответ дан 6 December 2019 в 10:54
поделиться

Я не думаю, что существует вызванная функция CreateConsole, но существует AllocConsole.

Принятие этого - то, что Вы имели в виду, я думаю, что различие - это AttachConsole(ATTACH_PARENT_PROCESS) может возвратиться ERROR_INVALID_HANDLE если родительский процесс не имеет консоли.

Попытайтесь выполнить этот код от обоих командная строка и Запуститесь-> Выполнение:

#include <windows.h>
#pragma comment ( lib, "user32.lib" )

int main()
{
    BOOL b;
    char msg[1024];

    b = FreeConsole();
    sprintf(msg, "%d", b);
    MessageBox(NULL, msg, "FreeConsole", 0);

    b = AttachConsole(ATTACH_PARENT_PROCESS);
    sprintf(msg, "%d", b);
    MessageBox(NULL, msg, "AttachConsole", 0);

    return 0;
}

Когда выполнено от командной строки, два окна сообщения, содержащие a 1 отображены, означая оба вызова, за которыми следуют. Когда выполнено от Запуска-> Выполнение, первое поле содержит 1 и второе содержит 0, подразумевать, что только первый вызов, за которым следуют. Второй перестал работать, потому что explorer.exe (который является родителем процесса, запущенного от Запуска-> Выполнение) не имеет консоли.

5
ответ дан 6 December 2019 в 10:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: