Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Автор: EZH
Дата сообщения: 04.02.2009 14:04
Mike13x13

Цитата:
Да и в вин.форм можно извратиться, к примеру, через WinAPI

Ты имеешь ввиду через AttachConsole?

Я не понял, ты хочешь именно в winform приложении пользоваться выводом через System.Console.WriteLine? А где это должно отображаться - в реальной консоли (доп. окне) или в TextBox?
Если консоль, то само winforms приложение будет из консоли запускаться или открывать само доп. окно консоли?
Автор: recvezitor
Дата сообщения: 04.02.2009 15:03
кто нибудь может это объяснить:

Код:

public static double FindMax(double[] a)
{
int i = 1, n = a.Length;
double max = a[0];
for (; i < n; i++)
{
if (a[i] > max)
{
max = a[i];
}
}
return max;
}

public static double FindMax(double[] a, out int index)
{
int i = 1, n = a.Length;
double max = a[0];
index = 0;
for (; i < n; i++)
{
if (a[i] > max)
{
max = a[i];
index = i;
}
}
return max;
}

static void Main(string[] args)
{
timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
timer1.Interval = 1;
times = 0;

int NN = 50000000;

double[] valuesDouble = new double[NN];

for (int i = 0; i < NN; i++)
{
valuesDouble[i] = i;
}
int index = 0;
times = 0;
timer1.Enabled = true;
max = FindMax(valuesDouble, out index);
timer1.Enabled = false;
Console.WriteLine("Find max with index: times: {0}ms, max={1}, index = {2}", times, max, index);

times = 0;
timer1.Enabled = true;
max = FindMax(valuesDouble);
timer1.Enabled = false;
Console.WriteLine("Aleks_max: times: {0}ms, max={1}", times, max);
}

Автор: DeMLaN
Дата сообщения: 04.02.2009 22:46
А кто может подсказать интересные варианты решения такой задачи:
1. Есть примерно 10 компов завязаных в локалку + на одном из них установлен MS SQL Server 2005.
2. Есть "куча" документов в вордовском формате (doc, rtf) примерно 200 Мб.

Нужно сделать программу (оболочку) в которой любой пользователь с любого компа сможет найти нужный документ, просмотреть его, распечатать и экспортировать в pdf, doc, rtf (как вариант docx)
Автор: Mike13x13
Дата сообщения: 04.02.2009 22:55
EZH

Цитата:
Ты имеешь ввиду через AttachConsole?

Этого я в виду не имел (скорее всего ), поскольку подробно не смотрел. На данный момент не настолько критично, что б рыть сильно глубоко.

Цитата:
Я не понял, ты хочешь именно в winform приложении пользоваться выводом через System.Console.WriteLine?

Именно так. А возможно, и считывать что-нить через System.Console.РидЛайн

Цитата:
А где это должно отображаться - в реальной консоли (доп. окне) или в TextBox?

в реальной консоли (доп. окне)

Цитата:
Если консоль, то само winforms приложение будет из консоли запускаться или открывать само доп. окно консоли?

winforms приложение должно само открывать доп. окно консоли.

Скажу чесно, это не особо животрепещущий вопрос, обычно я для вывода инфы в винформах присобачиваю где-нить текстбокс, а тут как-то на автомате вбил Console.WriteLine, компайлер не ругнулся, но в итоге я нихера не увидел. Тут меня и заело - зохотелось "стильно" выводить месаги в сонсоли Порыл МСДН, погуглил, нашел только что-то через импорт ядренных функций, о чем я, в общем-то, и сам догадывался, но делать так не хотел, а хотел именно Console.WriteLine ...

recvezitor

Цитата:
В результате:
С нахождением индекса: 8ms;
Без нахождения индекса: 10ms;

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

А в обратном порядке методы запускать пробовал ? А с чередованием и подсчетом общего и среднего времени? В общем, собери стат. базу, тогда можно подумать.

Добавлено:
DeMLaN

Цитата:
А кто может подсказать интересные варианты решения такой задачи:
1. Есть примерно 10 компов завязаных в локалку + на одном из них установлен MS SQL Server 2005.
2. Есть "куча" документов в вордовском формате (doc, rtf) примерно 200 Мб.

Нужно сделать программу (оболочку) в которой любой пользователь с любого компа сможет найти нужный документ, просмотреть его, распечатать и экспортировать в pdf, doc, rtf (как вариант docx)


На ТЗ это слабовато похоже, но есть у меня готовая програмка для подобных целей, лицензия на 1 комп - $300, на 10 отдам по $200
Автор: recvezitor
Дата сообщения: 05.02.2009 01:41
Всякоразно попробовал.Вот можете прогнать у себя если че...

Код:
class Program
{
#region MinMax

public static double FindMax(double[] a)
{
int n = a.Length;
double max = a[0];
for (int i = 1; i < n; i++)
{
if (a[i] > max)
{
max = a[i];
}
}

return max;
}

public static double FindMax(double[] a, out int index)
{
int n = a.Length;
double max = a[0];
index = 0;
for (int i = 1; i < n; i++)
{
if (a[i] > max)
{
max = a[i];
index = i;
}
}

return max;
}

public static double FindMin(double[] a)
{
int n = a.Length;
double min = a[0];
for (int i = 1; i < n; i++)
{
if (a[i] < min) min = a[i];
}
return min;
}

public static double FindMin(double[] a, out int index)
{
int n = a.Length;
double min = a[0];
index = 0;
for (int i = 1; i < n; i++)
{
if (a[i] < min)
{
min = a[i];
index = i;
}
}
return min;
}

#endregion MinMax

static int testCount = 10;
static int elementsCount = 100000000;
static double[] valuesDouble = new double[elementsCount];
static int index = 0;
static double max = 0;
static double averageTime = 0;
static void Main(string[] args)
{
timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
timer1.Interval = 1;
times = 0;

for (int i = 0; i < valuesDouble.Length; i++)
{
valuesDouble[i] = i;
}


WithoutIndexTests();
WithIndexTests();
WithoutIndexTests();
WithIndexTests();
}


public static void WithIndexTests()
{
averageTime=0;
for (int i = 0; i < testCount; i++)
{
times = 0;
timer1.Enabled = true;
max = FindMax(valuesDouble, out index);
timer1.Enabled = false;
Console.WriteLine("With index: time={0}ms, max={1}, index={2};", times, max, index);
averageTime += times / testCount;
}
Console.WriteLine("AVERAGE TIME: {0}ms", averageTime);
}

public static void WithoutIndexTests()
{
averageTime = 0;
for (int i = 0; i < testCount; i++)
{
times = 0;
timer1.Enabled = true;
max = FindMax(valuesDouble);
timer1.Enabled = false;
Console.WriteLine("Without index: time={0}ms, max={1};", times, max);
averageTime += times / testCount;
}
Console.WriteLine("AVERAGE TIME: {0}ms", averageTime);
}

public static void timer1_Elapsed(object sender, EventArgs e)
{
times += timer1.Interval;
}
}
Автор: KChernov
Дата сообщения: 05.02.2009 08:40
DeMLaN

Цитата:
Нужно сделать программу (оболочку) в которой любой пользователь с любого компа сможет найти нужный документ

Ну это как раз несложно - просто ссылки на все документы (расшаренные в сети) должны быть в БД с достаточной информацией, чтобы по БД их можно было найти.


Цитата:
просмотреть его, распечатать

Никто не мешает открыть и распечатать стандартными средствами, но можно и из проги, но сложнее.


Цитата:
и экспортировать в pdf, doc, rtf (как вариант docx)

В принципе это всё можно сделать из того же Ворда (для pdf-а надо будет поставить виртуальный принтер, например). Если надо из проги - надо искать конвертер и прикручивать.

В принципе если всё по-максимуму делать стандартными средствами, наверное проще всего сделать веб-интерфейс к БД.
Автор: Mike13x13
Дата сообщения: 05.02.2009 10:27
recvezitor

Цитата:
Всякоразно попробовал

Заинтриговал. Действительно, тенденция наблюдается.
Но вот в таком варианте времена практически сравниваются:

Код:
class Program
{
    #region MinMax

    public static double FindMax(double[] a)
    {
        int n = a.Length;
        double max = a[0]/3.0;
        for (int i = 1; i < n; i++)
        {
            if (a[i]/3 > max)
            {
                max = a[i]/3.0;
            }
        }
            return max;
    }

    public static double FindMax(double[] a, out int index)
    {
        int n = a.Length;
        double max = a[0]/3.0;
        index = 0;
        for (int i = 1; i < n; i++)
        {
            if (a[i]/3 > max)
            {
                max = a[i]/3.0;
                index = i;
            }
        }
        return max;
    }

    public static double FindMin(double[] a)
    {
        int n = a.Length;
        double min = a[0];
        for (int i = 1; i < n; i++)
        {
            if (a[i] < min) min = a[i];
        }
        return min;
    }

    public static double FindMin(double[] a, out int index)
    {
        int n = a.Length;
            double min = a[0];
            index = 0;
            for (int i = 1; i < n; i++)
            {
                if (a[i] < min)
                {
                    min = a[i];
                    index = i;
                }
            }
        return min;
    }

    #endregion MinMax

    static System.Timers.Timer timer1 = new System.Timers.Timer();
    static double times;
    static int testCount = 50;
    static int elementsCount = 10000000;
    static double[] valuesDouble = new double[elementsCount];
    static int index = 0;
    static double max = 0;
    static double fTime = 0;
    static double averageTime = 0;
    static Random rand = new Random();
    static double fwTime = 0;
    static double fwoTime = 0;
    
    static void Main(string[] args)
    {
        timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
        timer1.Interval = 10.0;
        times = 0.0;
        
        WithoutIndexTests();
        WithIndexTests();
        WithIndexTests();
        WithoutIndexTests();
        WithIndexTests();
        WithoutIndexTests();
        WithoutIndexTests();
        WithIndexTests();
        WithIndexTests();
        WithoutIndexTests();
        WithIndexTests();
        WithoutIndexTests();
        Console.WriteLine("With index: {0}, without: {1}\n", fwTime, fwoTime);
            
    }

    static void fillArr(double[] a)
    {
        for (int i = 0; i < a.Length; i++)
        {
            a[i] = rand.NextDouble();
        }
    }

    public static void WithIndexTests()
    {
        averageTime = 0; fTime = 0;
        for (int i = 0; i < testCount; i++)
        {
            times = 0;
            fillArr(valuesDouble);
            timer1.Enabled = true;
            max = FindMax(valuesDouble, out index);
            timer1.Enabled = false;
            Console.WriteLine("With index: time={0}, max={1}, index={2};", times, max, index);
            fTime += times;
        }
        averageTime += fTime / testCount;
        fwTime += averageTime;
        Console.WriteLine("With index AVERAGE TIME: {0}\n", averageTime);
    }

    public static void WithoutIndexTests()
    {
        averageTime = 0; fTime = 0;
        for (int i = 0; i < testCount; i++)
        {
            times = 0;
            fillArr(valuesDouble);
            timer1.Enabled = true;
            max = FindMax(valuesDouble);
            timer1.Enabled = false;
            Console.WriteLine("Without index: time={0}, max={1};", times, max);
            fTime += times;
        }
        averageTime = fTime / testCount;
        fwoTime += averageTime;
        Console.WriteLine("Without index AVERAGE TIME: {0}\n", averageTime);
    }

    public static void timer1_Elapsed(object sender, EventArgs e)
    {
        times += timer1.Interval;
    }
}
Автор: Lazy KoT
Дата сообщения: 05.02.2009 11:19
Mike13x13


Код:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace MyWinFormsApp
{
static class Program
{
[DllImport( "kernel32.dll" )]
static extern bool AttachConsole( int dwProcessId );
private const int ATTACH_PARENT_PROCESS = -1;

[STAThread]
static void Main( string[] args )
{
// redirect console output to parent process;
// must be before any calls to Console.WriteLine()
AttachConsole( ATTACH_PARENT_PROCESS );

// to demonstrate where the console output is going
int argCount = args == null ? 0 : args.Length;
Console.WriteLine( "\nYou specified {0} arguments:", argCount );
for (int i = 0; i < argCount; i++)
{
Console.WriteLine( " {0}", args[i] );
}

// launch the WinForms application like normal
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
Application.Run( new Form1() );
}
}
}
Автор: Mike13x13
Дата сообщения: 05.02.2009 15:15
Lazy KoT
Биг сенкс. Поэксперементирую. Тоже, конечно, через ВинАйПИ, но то, что я видел раньше, выглядело похужее. Отдельное спасибо за ссылку.


Добавлено:
Lazy KoT
Только это не совсем то. Это работает, если только запускаешь приложение из консоли. Эта же консоль и будет юзаться приложением. А я хотел, чтоб приложение открывало свою консоль, независимо от того, как было запущено.
Решается таким макаром:

Код:
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
[DllImport("kernel32.dll")]
static extern bool AllocConsole();
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
private const int ATTACH_PARENT_PROCESS = -1;

[STAThread]
static void Main( string[] args )
{
        
    FreeConsole();
    AllocConsole();
    AttachConsole(ATTACH_PARENT_PROCESS);

    // to demonstrate where the console output is going
    int argCount = args == null ? 0 : args.Length;
    //Console.Clear();
    Console.WriteLine("\nYou specified {0} arguments:", argCount);
    for (int i = 0; i < argCount; i++)
    {
        Console.WriteLine(" {0}", args[i]);
    }

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}
Автор: Lazy KoT
Дата сообщения: 06.02.2009 10:17
Mike13x13
Не всегда получается ровно реализовать работоспособность. (:

Вопрос: Создаю bitmap, по умолчанию он PixelFormat == PixelFormat.Format32bppArgb. Мне нужно эту картинку сохранить именно в bmp и с глубиной цвета 1бит, т.е. PixelFormat.Format1bppIndexed. Кто-нибудь может подсказать решение? RTMF и Google мне не помогли. ):
Спасибо.
Автор: Mike13x13
Дата сообщения: 06.02.2009 12:57
А так создавать

Код:
Bitmap bmp = new Bitmap(инт ширина, инт высота, PixelFormat.Format1bppIndexed);    
Автор: Lazy KoT
Дата сообщения: 06.02.2009 17:13
Mike13x13
Не получается потом Graphics добыть из bitmap-а у которого PixelFormat.Format1bppIndexed, впрочем как вообще из любого Indexed.
Автор: V0lt
Дата сообщения: 11.02.2009 09:22
Как сделать нередактируемый ComboBox?
...
нашел решение
ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
Автор: numetalist
Дата сообщения: 15.02.2009 14:36
можно вопрос, есть ли в .NET возможность передачи обьектов по сети? т.е. можно ли как то обойти с использованием стандартных средств фреймверка необходимость конвертирования всего обьекта в последовательность байтов. вобщем задача такова-хочу написать мессенджер, по типу Network Assistant, думал создать класс Message, описывающий объект с самим текстом сообщения, отправителем, адресатом, возможно системные комманды. для передачи по сети нужно будет все переводить в байты, тв принципе это не так сложно, но много чего придеться писать. имееться в виду передача через класс NetworkStream.
Автор: eLLoco
Дата сообщения: 15.02.2009 17:40
numetalist
Можно, ищи инфо по механизму Serialize.
Автор: niichavo
Дата сообщения: 15.02.2009 18:37
Здравствуйте!

У меня такой вопрос. Как используя, например, C# можно программно изменять и просматривать права на принтер (расшаренный или локальный)? Для файлов и директорий всё есть, а для принтера сколько ни гуглил - нифига не нашёл. Имеется ввиду права пользователя или группы на "печать", "управление принтерами", "управление документами". Помогите, не проходите мимо.
Автор: GastonR
Дата сообщения: 15.02.2009 22:35
niichavo

Цитата:
У меня такой вопрос. Как используя, например, C# можно программно изменять и просматривать права на принтер (расшаренный или локальный)?

Я не знаю насколько полную информацию можно получить, т.к. никогда не сталкивался с подобной задачей, но думаю что нужно копать в сторону WMI. В частности Win32_Printer Class У этого класса есть методы GetSecurityDescriptor/SetSecurityDescriptor. Посмотри так же статью Changing Access Security on Securable Objects Еще в пространстве имен System.Drawing.Printing есть класс PrintingPermission. Хотя по-моему он тебе не подойдет.
Автор: niichavo
Дата сообщения: 16.02.2009 08:38
GastonR
Спасибо. Но...

Цитата:
Win32_Printer Class У этого класса есть методы GetSecurityDescriptor/SetSecurityDescriptor

Эти методы работают только под висту и 2008 сёрвер.

Цитата:
Changing Access Security on Securable Objects

В этой статье приводятся объекты, методы которых я могу вызывать, чтобы прочитать/изменить ACL. Если я, конечно, ничего не путаю. У Win32_Printer эти методы есть. Но работать будут только под вистой и выше.

Класс PrintingPermission и тому подобное действительно не подходят.
Использовать утилиты типа "SetACL" как-то не очень охота.
Шож делать-то? Неужели больше никак нельзя добраться до ACL принтера?
Автор: GastonR
Дата сообщения: 16.02.2009 09:33
niichavo

Цитата:
Эти методы работают только под висту и 2008 сёрвер.

Не туда глянул Класс поддерживается начиная с Windows 2000, а метод действительно только начиная с Висты.
Вот еще один пример Handling NTFS Permissions Part-5 (handling printer permissions)
Он правда написан на VB 6.0 c использованием Win32 API, но я не думаю что могут возникнуть проблемы с прочтением.
Автор: niichavo
Дата сообщения: 16.02.2009 09:57
GastonR
Спасибо, изучу.
Автор: numetalist
Дата сообщения: 16.02.2009 13:26
eLLoco
большое тебе спасибо.....выручил
Автор: 085
Дата сообщения: 17.02.2009 19:37
вроде в аспнет есть встроенные средства для аутентификации пользователей?? Всмысле проверка имени и пароля пользователя и т.п.
Автор: ekky
Дата сообщения: 18.02.2009 10:54

085

В ASP.NET существует встроенная инфраструктура для реализации схемы входа. Для того чтобы настроить приложение для применения аутентификации нужно внести изменения в его корневой файл web.config:

<system.web>
        <authentication mode="Forms">
            <forms loginUrl="main.aspx" defaultUrl="main.aspx"/>
        </authentication>
    </system.web>

По умолчанию службы используют провайдера AspNetSqlProvider. В таком случае ASP.NET автоматически создает базу данных ASPNETDB.MDF в директории проекта App_Data, когда запускается команда ASP.NET Configuration — или программно, или с помощью элементов управления группы Login задействуются службы Membership или Role Manager.
Элемент authentication mode определяет способ аутентификации. Если это Forms, то свои имя и пароль пользователь вводит в форме. В локальной сети (интранет) можно аутентифицировать пользователей по их учетной записи, тогда его значение ставится как Windows.
А так же посмотри в сторону элементов управления Login.
Автор: numetalist
Дата сообщения: 18.02.2009 15:11
можно еще вопрос. возможно ли, используя .NET совмещать использование управляемого и неуправляемого кода? например с использованием написаных на не managed С++ библиотек, или как то еще? просто хотелось бы ограничить число управляемого кода - не сильно быстродействием славиться. не до минимализма конечно, но все же.
Автор: LuckyStrike
Дата сообщения: 18.02.2009 15:18
Плиззз..помогите!!"написанно на Microsoft Visual C#"
1)Вывести «столбиком» значения sin0.1 sin0.2.......sin1.1
Примерный код:
int a;
string s;
s = Console.ReadLine();
a=Convert.ToInt32(s);
double b = 0;
double i;

for ( i = 0.1; i <= 2; i++) ;

b = Math.Sin(i);
Console.WriteLine(b);

2)Дано натуральное число. Найти число, получаемое в результате приписывания по двойке в начало и конец записи исходного числа.
Автор: numetalist
Дата сообщения: 18.02.2009 17:00
начну со второго

//Данное число.
int a;

string temp = "2";
temp += Convert.ToString(a);

temp+="2";

int a = Convert.ToInt32(temp);

Добавлено:
насчет первого я так и не понял, зачем тебе "a"?

Добавлено:
и пишешь ты не оч красиво, можно было расписать в половину короче.

Добавлено:
люди, а можно вопрос, так сказать личного характера? как часто изучают C# в вузах СНГ и в часности Украины? интерестно, самого в вузе на это подсадили
Автор: Lazy KoT
Дата сообщения: 18.02.2009 17:23
numetalist

Цитата:
не сильно быстродействием славиться

Из CLR via C# Рихтера:

Цитата:

Если вы тоже скептик, сами создайте приложение и проверьте его производи
тельность. Кроме того, можете взять для этих целей какоенибудь нетривиальное
приложение от Microsoft или другого разработчика. Я думаю, вас удивит, насколько
быстродействие высоко на самом деле.
Трудно поверить, но многие (включая меня) считают, что управляемые при
ложения могут работать производительнее неуправляемых, и тому есть масса
причин. Взять хотя бы тот факт, что превращая ILкод в команды процессора в
период выполнения, JITкомпилятор располагает более полными сведениями о
среде выполнения, чем компилятор неуправляемого кода. Вот особенности, ко
торые позволяют управляемому коду «опередить» неуправляемый.
 JITкомпилятор может обнаружить факт выполнения приложения на Pentium 4
и сгенерировать машинный код, полностью использующий все преимущества
особых команд этого процессора. Неуправляемые приложения обычно ком
пилируют в расчете на среднестатистический процессор, избегая специ
фических команд, которые заметно повышают производительность приложе
ния на новейших процессорах.
 JITкомпилятор может обнаружить, что определенное выражение на конкрет
ной машине всегда равно false. Например, посмотрим на метод с таким кодом:
if (numberOfCPUs > 1) {
...
}
Здесь numberOfCPUs — число процессоров. Код указывает JITкомпилято
ру, что для машины с одним процессором не нужно генерировать никаких
машинных команд. В этом случае машинный код оптимизирован для конкрет
ной машины: он короче и выполняется быстрее.
 CLR может проанализировать выполнение кода и перекомпилировать ILкод в
команды процессора во время выполнения приложения. Перекомпилирован
ный код может реорганизовываться с учетом обнаруженных некорректных
прогнозов ветвления.
Это лишь малая часть аргументов в пользу того, что управляемый код будуще
го будет исполняться лучше сегодняшнего неуправляемого. Как я сказал, произ
водительность и сейчас очень неплохая для большинства приложений, а со вре
менем ситуация только улучшится.


Но если уж очень хочется - посмотри на DllImport.

LuckyStrike
1)

Код:
for (double i = 0.1; i < 1.2; i+= 0.1)
{
Console.WriteLine(Math.Sin(i));
}

Console.ReadKey();
Автор: numetalist
Дата сообщения: 18.02.2009 17:34
переплюнул, забыл, под консоль давно не писал, забыл, про вставку в строку переменых....а за остальное, спс, не заморачивался, вбил в голову, понятие (non-managed быстрее managed == true).....но ассамблер всеравно не переплюнуть никому.....
Автор: LuckyStrike
Дата сообщения: 19.02.2009 18:42
=) Спасибки большое за помощь))))

Елси не сложно еще две)))
1)Дано число a (1 < a &#8804; 1,5). Из чисел 1, 1+1\2, 1+1/3,… вывести те, которые не меньше a.

2)Найти произведение всех целых чисел от a до b (значения a и b вводятся самим)
Автор: Lazy KoT
Дата сообщения: 19.02.2009 19:39
LuckyStrike

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102

Предыдущая тема: Как удалить/добавить/отключить/включить устройство?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.