我有一些C++代码使用cout语句进行调试,由于某些原因我不能打印所有数据,除非我最后做了std::cout.flush();.
我不太明白为什么需要这种刷新操作.
有人有任何见解吗?
任何人都可以告诉他们之间是否存在差异
>manage.py flush # or reset
Run Code Online (Sandbox Code Playgroud)
和
>manage.py sqlclear appname | python manage.py dbshell
>manage.py syncdb
Run Code Online (Sandbox Code Playgroud) 我对Hibernate的理解是,当对象从DB加载时,它们被添加到Session中.在不同的点上,根据您的配置,会话被刷新.此时,修改后的对象将写入数据库.
Hibernate如何确定哪些对象是"脏的"并且需要编写?
Hibernate生成的代理是否拦截了对字段的赋值,并将对象添加到Session中的脏列表中?
或者Hibernate是否查看Session中的每个对象并将其与对象的原始状态进行比较?
还是完全不同的东西?
我正在考虑和HENRI COOK一样的问题.据我们从简短描述中可以看出,它被报告为Apache Jira上的一个错误.
我的问题实质上是事件只在应用程序关闭时记录(甚至在事件发生后几周).当记录量非常低时会发生这种情况.我在Windows Server 2008 R2上看到了这一点.这可以防止我们捕获并对生产错误做出反应.
现在,appender不是缓冲的.默认情况下,每次附加消息时,它还会在基础流上调用Flush().
我的问题是为什么不冲洗?除了以编程方式刷新所有appender之外,还有什么补救措施吗?你会认为一个脉动的appender是一个可行的解决方案吗?
appender配置:
<appender name="RollingErrorFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="D:\LogFiles\zzzz\xxxxxx__ERROR" />
<param name="AppendToFile" value="true" />
<param name="DatePattern" value="_yyyyMMddHH".log"" />
<param name="RollingStyle" value="Date" />
<param name="StaticLogFileName" value="false" />
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="FATAL" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%utcdate{yyyy-MM-dd HH:mm:ss.fff},[%thread],%level,%logger,%m%n"/>
</layout>
</appender>
Run Code Online (Sandbox Code Playgroud)
更新2013-06-19
我无法用任何代码重现行为.无论我尝试多么糟糕,数据总是立即写入磁盘.但是,进行了一项重要的观察:如果对文件的第一次写入大于1KiB,则修改时间永远不会随后写入更新.只有在关闭时关闭文件时才会更新它.另一方面,如果第一次写入是短的单行,则任何后续写入都将更新修改时间.这种行为在log4net和手动IO操作之间,在32位WinXP和64位W2k8R2之间,在.NET 2.0,3.5和.NET 4.0之间是一致的.这仍然没有解决问题,但至少我现在可以理解奇怪的修改时间模式.
谢谢,罗布
TFileStream提供缓冲输出,这在大多数情况下都很好,但在某些情况下(特别是在调试期间),立即刷新缓冲区会很好.事情是,除了打电话给Free之外,我不知道有什么方法可以做到这一点,这有点适得其反.
有没有更好的方法呢?
有人可以更明确地解释缓冲区的概念吗?我知道缓冲区是存储字符的数据结构,以及从中读取数据的位置.冲洗缓冲区的想法是什么?
刷新缓冲区时,这是指写入存储在其中的字符的行为吗?
从文字:
To avoid the overhead of writing in response to each output request, the library uses the
buffer to accumulate the characters to be written, and flushes the buffer, by writing its
contents to the output device, only when necessary. By doing so, it can combine several
output operations into a single write.
Run Code Online (Sandbox Code Playgroud)
当提到"刷新"时,几乎使其听起来好像缓冲区正在写入但同时也被擦除.只是猜测.
那么,为了写入屏幕上的视图需要缓冲区刷新?
When our program writes its prompt to cout, that output goes into the buffer associated
with the standard output stream. Next, we attempt …Run Code Online (Sandbox Code Playgroud) 何时需要刷新文件?
我从来没有这样做,因为我调用File.Close,我认为它是自动刷新的,不是吗?
在某些情况下,我需要立即强制刷新logback的文件appender.我在docs中发现默认情况下启用此选项.神秘地说这不起作用.正如我在源代码中看到的过程涉及BufferedOutputSream正确.有什么问题BufferedOutputSream.flush()吗?可能这与冲洗问题有关.
更新:我在Windows XP Pro SP 3和Red Hat Enterprise Linux Server 5.3版(Tikanga)上发现了这个问题.我使用了这些库:
jcl-over-slf4j-1.6.6.jar
logback-classic-1.0.6.jar
logback-core-1.0.6.jar
slf4j-api-1.6.6.jar
Run Code Online (Sandbox Code Playgroud)
该logback.xml方法是:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/somepath/file.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>file.log.%i</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE"/>
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
更新: 我提供单元测试,但似乎不那么简单.让我更清楚地描述这个问题.
immidiateFlush默认情况下为true,因此flush()显式调用方法稍后当一些底层缓冲区流动时,事件出现在文件中.所以问题是:输出流是否保证立即刷新?
说实话,我已经通过实现我自己的ImmediateRollingFileAppender利用FileDescriptor立即同步的工具来解决这个问题.任何有兴趣的人都可以这样做.
所以这不是一个回归问题.
这是我的功能打开串口(使用Ubuntu 12.04):
int open_port(void)
{
int fd; /* File descriptor for the port */
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
// Could not open the port.
perror("open_port: Unable to open /dev/ttyUSB0 - ");
}
else
fcntl(fd, F_SETFL, 0);
struct termios options;
tcgetattr(fd, &options);
//setting baud rates and stuff
cfsetispeed(&options, B19200);
cfsetospeed(&options, B19200);
options.c_cflag |= (CLOCAL | CREAD);
tcsetattr(fd, TCSANOW, &options);
tcsetattr(fd, TCSAFLUSH, &options);
options.c_cflag &= ~PARENB;//next 4 lines setting 8N1
options.c_cflag &= ~CSTOPB; …Run Code Online (Sandbox Code Playgroud) 有没有办法在persist/flush之前获取实体ID?我的意思是:
$entity = new PointData();
$form = $this->createForm(new PointDataType(), $entity);
Run Code Online (Sandbox Code Playgroud)
如果我此时尝试$ entity-> getId(),它什么都不返回.
我可以通过以下方式获得它:
$em->persist($entity);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
(假设$ em = $ this-> getDoctrine() - > getEntityManager();)
我怎样才能做到这一点?